rust

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>…

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…

Method Syntax

https://doc.rust-lang.org/book/method-syntax.html Go言語のように、( struct )型に対してメソッドを定義する方式のようだ。 struct Circle { x: f64, y: f64, radius: f64, } impl Circle { fn area(&self) -> f64 { std::f64::consts::PI * (self.radius…

Patterns #2

https://doc.rust-lang.org/book/patterns.html let x = 5; match x { ref r => println!("Got a reference to {}", r), } // -> "Got a reference to 5"が表示される match x { 3 => println!("three"), 5 => println!("five"), _ => println!("_"), } // -…

Patterns

https://doc.rust-lang.org/book/patterns.html 構造体のmatchもできるのが便利。 struct Point { x: i32, y: i32, } let origin = Point { x: 2, y: 4 }; match origin { Point { x, y } => println!("({},{})", x, y), } // -> (2,4) match origin { Point…

Match

https://doc.rust-lang.org/book/match.html matchした結果を変数に代入できるのが良い。 let number = match x { 1 => "one", 2 => "two", 3 => "three", 4 => "four", 5 => "five", _ => "something else", };

Enums

https://doc.rust-lang.org/book/enums.html enumについて。色々な型を対象にできる事は分かったが、それ以上の事がいまいち分からなかった。

Structs

https://doc.rust-lang.org/book/structs.html メンバ名をつけない構造体をタプルと扱う感じみたい。 構造体のメンバをまとめて設定する方法があるのが良い。C言語はできないのですよね。 let mut point = Point3d { x: 0, y: 0, z: 0 }; point = Point3d { …

Mutability

https://doc.rust-lang.org/book/mutability.html C言語のconstと逆の働きと捉えると考えやすいかもしれない。 fn main() { let mut x = 5; let mut x2 = 7; let y = &mut x; *y += 1; // y = &mut x2; // できない println!("{}", *y); let mut x = 5; // …

Lifetimes #3

https://doc.rust-lang.org/book/lifetimes.html 理解が追いついていない。 リソースを安全に扱うために、どこまではリソースが生きているかを明確にしているということだろうか。 基本的にはコンパイラの方で、<'a>は補完してくれるようなので嬉しい。

Lifetimes #2

https://doc.rust-lang.org/book/lifetimes.html を少々。 struct Foo<'a> { x: &'a i32, } fn main() { let y = &5; // this is the same as `let _y = 5; let y = &_y;` let f = Foo { x: y }; println!("{}", f.x); } &5と記載可能な事に驚き。

Lifetimes

https://doc.rust-lang.org/book/lifetimes.html を少々。 fn main() { let r; // Introduce reference: r { let i = 1; // Introduce scoped value: i r = &i; // Store reference of i in r } // i goes out of scope and is dropped. println!("{}", r); …

References and Borrowing #2

https://doc.rust-lang.org/book/references-and-borrowing.html 変数書き換え不可にするのは大変なんだな。 let mut x = 5; { let y = &mut x; // -+ &mut borrow starts here *y += 1; // | } // -+ ... and ends here println!("{}", x); // <- try to bo…

References and Borrowing

https://doc.rust-lang.org/book/references-and-borrowing.html を途中まで。 特別気になる箇所はなし。 fn main() { fn sum_vec(v: &Vec<i32>) -> i32 { return v.iter().fold(0, |a, &b| a + b); } fn foo(v1: &Vec<i32>, v2: &Vec<i32>) -> i32 { let s1 = sum_vec(v1);</i32></i32></i32>…

Owership #2

https://doc.rust-lang.org/book/ownership.html 単一(スカラ?)な変数はコピーなので、代入元でも代入先でも使えるが、 複数(ベクタ)の要素の変数は参照なので、代入先では使えるが、代入元では使用不可とするみたいな話なのかな。 let a = 3; let v1 = vec!…