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

Owership

https://doc.rust-lang.org/book/ownership.html を途中まで。 関数の中で関数が宣言できるらしい。 コメントにしている箇所は、コメントアウトするとエラーになる処理。 fn main() { let v = vec![1, 2, 3]; println!("v[0] is: {}", v[0]); let v2 = v; //…

Vectors

https://doc.rust-lang.org/book/vectors.html 書き換え可能な参照と、書き換え不可能な参照がある。 fn main() { let mut v = vec![1, 2, 3, 4, 5]; for i in &v { // *i = *i + 1; // 不可能 println!("A reference to {}", i); } for i in &mut v { *i = …

Loops

https://doc.rust-lang.org/book/loops.html Loop labels( 条件付きgoto )がよい。 サンプルコードはcontinueだけだったが、breakでも意図通り動く。 fn main() { 'outer: for x in 0..10 { 'inner: for y in 0..10 { if x % 2 == 0 { continue 'outer; } //…

if #2

https://doc.rust-lang.org/book/if.html 3項演算子的な使い方ができる。 println!の引数に使えるかを試してみたところ普通に動いた。 fn main() { let y = if x == 5 { 10 } else { 15 }; // y: i32 println!("y is {}", y); println!("? is {}", if x == 5…

if

https://doc.rust-lang.org/book/if.html カッコが無くても問題ない。 fn main() { let x = 5; if x == 5 { println!("x is five!"); } if (x == 5) { println!("x is five!"); } } 逆にカッコをつけると警告が・・・ $ cargo run warning: unnecessary pare…

Comments

Comments。 rustdocというツールでコメントからドキュメント生成できるらしい。Markdownで記載できるらしい。 ブロックコメントについて説明は無かったけども、/* comment */は普通にコメントになった。 //! # The Rust Standard Library //! //! The Rust S…

Primitive Types

Primitive Typesを読む。 型の名称がPythonっぽい印象。

Functions

Functionsを読む。 return x + 1;とx + 1(セミコロンがない)が同じ扱いなのが面白い。 あと、プロトタイプ宣言不要なのがC言語から入った身としては嬉しい。 fn main() { let f: fn(i32) -> i32; // 関数ポインタ f = add_one; print_number(5); print_sum(5…

Variable Bindings

Variable Bindingsを読む。 幾つか面白い動きがあった。デフォルトが書き換え不可(immutable)だからできる動きなんだろうな。 fn main() { /* スコープ:{} 以下でのみ有効 */ let x: i32 = 17; { let y2: i32 = 3; println!("The value of x is {} and valu…

Guessing Gameを読み進める4

Guessing Gameを最後まで読み進めた。 loop、continue、breakなどループ関係の文法が出てきた。 無限ループが簡単に作れるのと、繰り返し処理と分かり易いのが良い。

Guessing Gameを読み進める3

Guessing Gameを読み進める。 ( Comparing guessesを読んだ。 ) 型チェックが結構厳しめっぽい。

Guessing Gameを読み進める2

Guessing Gameを読み進める。 ( Generating a secret numberを読んだ。 ) Cargo.tomlにrand="0.3.0"を追記すると、cargo buildするだけで、関連するライブラリを引っ張ってきてくれる。便利。 $ cargo build Updating registry `https://github.com/rust-lan…

Guessing Gameを読み進める

Guessing Gameを読み進める。 let foo = 5; // immutable. let mut bar = 5; // mutable 普通に宣言すると書き換え不可の変数になるみたい。

Cargo

Cargoというビルドツールを使ってみる。 [package] name = "hello_world" version = "0.0.1" authors = [ "MIURA Yasuyuki <xxxxxxxx@xxxxxx.xxx>" ] $ mkdir src $ mv main.rs src/main.rs $ cargo build $ cargo run ソースファイルをsrcディレクトリに置く必要があったり、最近</xxxxxxxx@xxxxxx.xxx>…

ハローワールド

Rustでハローワールド。 fn main() { println!("Hello, world!"); } !が付くと、普通の関数ではなく、マクロになるらしい。詳しいことは今後学ぶ。 実行は以下。 $ rustc main.rs $ ./main 拡張子は、rsなんですね。

Rust始めます

Rustの勉強を始めます。 今日は環境をインストールするところまで。 $ curl https://sh.rustup.rs -sSf | sh $ source $HOME/.cargo/env $ rustc --version 次回以降も使えるようにsource $HOME/.cargo/envを$HOME/.bash_profileに追記。

Tensorflow動いた

TensorFlow試してみた - アウトスタンディングなプログラマを目指してにて、動かせていなかったTensorflowをとりあえず動かせた。 ディープラーニングの有名ライブラリ5種を最短距離で試す半日コース(TensorFlow, Chainer, Caffe, DeepDream, 画風変換) - …