Conditional Compilation

https://doc.rust-lang.org/book/conditional-compilation.html #[cfg]にて色々設定できる。C言語でいう#if、#ifdefみたいなもののようです。

Testing

https://doc.rust-lang.org/book/testing.html テストの実施環境について。言語に標準でテストの仕組みが含んでいたり、ドキュメントに記載されている。これだけでも今どきの言語だという感じがします。 テストの実施方法はドキュメントを読んだ限りではシン…

The Stack and the Heap

https://doc.rust-lang.org/book/the-stack-and-the-heap.html スタックとヒープについて。 変数宣言でスタックが積み上がっていくなど、目新しいところはなさそう。

Unsafe

[https://doc.rust-lang.org/book/unsafe.html 危ない操作をどうしても行いたい時はunsafeを使う。unsafeを使わざるを得ない事は少ないようだ。

Raw Pointers

https://doc.rust-lang.org/book/raw-pointers.html 単に*で宣言したポインタは安全ではない(何も指し示していないかもしれない)ので、unsafe内で展開して使用する。 fn main() { let x = 5; let raw = &x as *const i32; // println!("raw points at {}", *…

Macros #2

https://doc.rust-lang.org/book/macros.html 再帰的にマクロを使ったり、マクロは奥が深そう。 章の量も他の章と比べ、明らかに多い。 unreachable!が面白い。デバッグ等で活躍しそう。 if false { unreachable!(); }

Macros

https://doc.rust-lang.org/book/macros.html マクロ。 /* vec!と同じ働きをするマクロ定義 */ macro_rules! myvec { ( $( $x:expr ),* ) => { { let mut temp_vec = Vec::new(); $( temp_vec.push($x); )* temp_vec } }; } macro_rules! o_O { ( $( $x:expr…

`Deref` coercions

https://doc.rust-lang.org/book/deref-coercions.html *も型に合わせて定義できる。 use std::ops::Deref; struct DerefExample<T> { value: T, } impl<T> Deref for DerefExample<T> { type Target = T; fn deref(&self) -> &T { &self.value } } fn main() { let x</t></t></t>…

Operators and Overloading

https://doc.rust-lang.org/book/operators-and-overloading.html 新たに定義した型に対して+を定義できる。 use std::ops::Add; #[derive(Debug)] struct Point { x: i32, y: i32, } impl Add for Point { type Output = Point; fn add(self, other: Point)…

Unsized Types

https://doc.rust-lang.org/book/unsized-types.html サイズ不定の型を定義できるみたい。Rustは型の扱いが厳格だと思っていたので驚き。

Associated Types

https://doc.rust-lang.org/book/associated-types.html trait Graph { type N; type E; fn has_edge(&self, &Self::N, &Self::N) -> bool; fn edges(&self, &Self::N) -> Vec<Self::E>; } struct Node; struct Edge; struct MyGraph; impl Graph for MyGraph { type </self::e>…

Casting Between Types

https://doc.rust-lang.org/book/casting-between-types.html 型のキャストについて。asを使用する。 use std::mem; fn main() { let one = true as u8; let at_sign = 64 as char; let two_hundred = -56i8 as u8; println!("{}, {}, {}", one, at_sign, tw…

Type Aliases

https://doc.rust-lang.org/book/type-aliases.html typeキーワードで型に別名をつけられる。C言語でいうtypedef。 fn main() { type Name = String; let x: Name = "Hello".to_string(); println!("{}", x); type Num = i32; let x: i32 = 5; let y: Num = …

Attributes

https://doc.rust-lang.org/book/attributes.html #[hoge]という記法をattributeというものらしい。 #[cfg(target_os = "macos")] // macosだけで動作する fn only() { println!("mac"); } #[cfg(target_os = "linux")] // linuxだけで動作する fn only() { …

const and static

https://doc.rust-lang.org/book/const-and-static.html 定数を定義する方法。letでもmutつけなければ定数代わりになると思ったが、メモリ配置のされ方が違ったりするらしい。 また、同じスコープ内で同じ名前の定義を行う場合、letの場合は可能だったが、co…

Crates and Modules

https://doc.rust-lang.org/book/crates-and-modules.html Rustはデフォルトがプライベートで、pubをつけるとグローバルになる。 extern crate phrases as sayings; use sayings::japanese::greetings as ja_greetings; use sayings::japanese::farewells::*…

Universal Function Call Syntax

https://doc.rust-lang.org/book/ufcs.html 複数のtraitを実装したことにより、同じ名前の関数を持った際は、Trait::関数名としてどの関数を実行するか指定する必要がある。 trait Foo { fn f(&self); } trait Bar { fn f(&self); } struct Baz; impl Foo fo…

Closures #2

https://doc.rust-lang.org/book/closures.html closureを引数や戻り値にする事ができる。戻り値にするのは結構面倒というか、あまり直感的ではない感じ。 fn main() { fn call_with_one2(some_closure: &Fn(i32) -> i32) -> i32 { // closureを引数に取る。…

Closures

https://doc.rust-lang.org/book/closures.html fn main() { let num = 5; let plus_num = |x: i32| x + num; let num = 6; println!("{}", num); // 6が表示される assert_eq!(10, plus_num(5)); // エラーとならない。 } plus_num内のnumと、main直下のnum…

Trait Objects #2

https://doc.rust-lang.org/book/trait-objects.html サンプルが一部動かせなかったということもあって理解出来ていない。 そもそも動くサンプルではなく、概念を示すコードなのかもしれないが・・・ 分からないなりに、この先を進める。

Trait Objects

https://doc.rust-lang.org/book/trait-objects.html trait Foo { fn method(&self) -> String; } impl Foo for u8 { fn method(&self) -> String { format!("u8: {}", *self) } } impl Foo for String { fn method(&self) -> String { format!("string: {}"…

if let

https://doc.rust-lang.org/book/if-let.html if letという構文を使うと簡潔に書けることがある。 fn foo(x: i32) { println!("{}", x); } fn main() { let option: Option<i32> = Some(5); match option { Some(x) => { foo(x) }, None => {}, } if option.is_so</i32>…

Osaka HoloLens Meetup vol.1 参加してきました

「Osaka HoloLens Meetup vol.1 - connpass」に参加してきました。 ハンズオンと、Meetupの2部構成で、ハンズオンからの参加。 ハンズオンでは、Unity + Visual Studioにて書いたソフトを動かす体験と、HoloLens複数台で場所(?)を共有して動かす体験。 こん…

Drop

https://doc.rust-lang.org/book/drop.html Dropというtraitsについて。 変数が消える時に、何かやらせたい時に使う。デストラクタってやつですね。 struct HasDrop; impl Drop for HasDrop { fn drop(&mut self) { println!("Dropping!"); } } struct Firew…

Traits #4

https://doc.rust-lang.org/book/traits.html 継承の概念もある。 trait Foo { fn foo(&self); } trait FooBar : Foo { fn foobar(&self); }

Traits #3

https://doc.rust-lang.org/book/traits.html trait Foo { fn is_valid(&self) -> bool; fn is_invalid(&self) -> bool { !self.is_valid() } } trait内に実装も書けるのか。

Traits #2

https://doc.rust-lang.org/book/traits.html 既存の型を拡張できる。Rubyっぽい。 impl HasArea for i32 { fn area(&self) -> f64 { println!("this is silly"); *self as f64 } } fn main() { 5.area(); }

Traits

https://doc.rust-lang.org/book/traits.html JavaのInterface、C++のvirtual functionに相当する機能をRustでは、Trait( 特性、特徴)と呼ぶ。 trait HasArea { fn area(&self) -> f64; fn is_larger(&self, &Self) -> bool; } fn print_area<T: HasArea>(shape: T) { pr</t:>…

Generics

https://doc.rust-lang.org/book/generics.html T(型)を指定する事で、色々と使えるテンプレート機能。 <T>を明示的に指定せずとも、使えるのがスゴい。 struct Point<T> { x: T, y: T, } impl<T> Point<T> { fn swap(&mut self) { std::mem::swap(&mut self.x, &mut sel</t></t></t></t>…

Strings

https://doc.rust-lang.org/book/strings.html let s = "foo bar"; let t = "foo\n bar"; sとtが同じ意味になるのが面白い。 let hachiko = "忠犬ハチ公"; for b in hachiko.as_bytes() { print!("{}, ", b); } println!(""); for c in hachiko.chars() { pr…