rust

Release Channels

https://doc.rust-lang.org/book/release-channels.html Rustは Nightly Beta Stable の3種類がある。 Betaは6週間間隔でバージョンが上がるプロセスが出来上がっているみたい。リリースマネジメント(?)が着実に行われている。

Borrow and AsRef

https://doc.rust-lang.org/book/borrow-and-asref.html BorrowとAsRefについて。 サンプルコードを動かしてみた。 use std::borrow::Borrow; use std::fmt::Display; fn foo<T: Borrow<i32> + Display>(a: T) { println!("a is borrowed: {}", a); } fn bar<T: AsRef<str>>(s: T) { let m</t:></t:>…

FFI

https://doc.rust-lang.org/book/ffi.html 他言語で記載されたライブラリをRustから使うための方法。ライブラリのパスをさくっと通せなかったので、動かしてみるのをあきらめた。

Choosing your Guarantees

https://doc.rust-lang.org/book/choosing-your-guarantees.html Guaranteesは保証という意味の単語らしい。 use std::cell::Cell; use std::cell::RefCell; fn main() { let x = Cell::new(1); let y = &x; let z = &x; x.set(2); y.set(3); z.set(4); prin…

Error Handling #10

https://doc.rust-lang.org/book/error-handling.html サンプルの'‘city-pop’‘を最後まで。 extern crate getopts; extern crate rustc_serialize; extern crate csv; use getopts::Options; use std::env; use std::fs::File; use std::path::Path; use std…

Error Handling #9

https://doc.rust-lang.org/book/error-handling.html 今日は、Error handling with a custom typeの手前まで。

Error Handling #8

https://doc.rust-lang.org/book/error-handling.html Reading from stdinの手前まででビルド通った。 extern crate getopts; extern crate rustc_serialize; extern crate csv; use getopts::Options; use std::env; use std::fs::File; use std::path::Pat…

Error Handling #7

https://doc.rust-lang.org/book/error-handling.html Errorというtraitが存在する。

Error Handling #6

https://doc.rust-lang.org/book/error-handling.html エラーの定義。 use std::io; use std::num; // We derive `Debug` because all types should probably derive `Debug`. // This gives us a reasonable human readable description of `CliError` valu…

Error Handling #5

https://doc.rust-lang.org/book/error-handling.html ファイル処理の異常処理の続き。エラーの時の処理が明示的になってきたように思う。 use std::fs::File; use std::io::Read; use std::path::Path; fn file_double<P: AsRef<Path>>(file_path: P) -> Result<i32, String> { let mut </i32,></p:>…

Error Handling #4

https://doc.rust-lang.org/book/error-handling.html use std::fs::File; use std::io::Read; use std::path::Path; fn file_double<P: AsRef<Path>>(file_path: P) -> i32 { let mut file = File::open(file_path).unwrap(); // error 1 let mut contents = String::new()</p:>…

Error Handling #3

https://doc.rust-lang.org/book/error-handling.html use std::env;すると、argv.nthで引数をとれる。 引数の有無でエラー判定するための方法。 use std::env; fn ok_or<T, E>(option: Option<T>, err: E) -> Result<T, E> { match option { Some(val) => Ok(val), None =></t,></t></t,>…

Error Handling #2

https://doc.rust-lang.org/book/error-handling.html 文字列を整数にパースするときのエラーハンドリング。 use std::num::ParseIntError; fn double_number(number_str: &str) -> Result<i32, ParseIntError> { number_str.parse::<i32>().map(|n| 2 * n) } fn main() { match doubl</i32></i32,>…

Error Handling

https://doc.rust-lang.org/book/error-handling.html とても長い。基本はpanic!マクロを使ってエラーを発生させるということらしい。

Concurrency #2

https://doc.rust-lang.org/book/concurrency.html 並行処理続き。channelについて。rxからtxにデータが渡るまで、tx側は処理を待つ。 use std::thread; use std::sync::mpsc; fn main() { let (tx, rx) = mpsc::channel(); for i in 0..10 { let tx = tx.cl…

Concurrency

https://doc.rust-lang.org/book/concurrency.html 並列処理について。 use std::sync::{Arc, Mutex}; use std::thread; use std::time::Duration; fn main() { let data = Arc::new(Mutex::new(vec![1, 2, 3])); for i in 0..3 { let data = data.clone(); …

Iterators

https://doc.rust-lang.org/book/iterators.html fn main() { let num = (1..) .filter(|&x| x % 2 == 0) .filter(|&x| x % 3 == 0) .take(5) .collect::<Vec<i32>>(); for n in num.iter() { println!("{}", n); } } $ cargo run Finished debug [unoptimized + debu</vec<i32>…

Documentation

https://doc.rust-lang.org/book/documentation.html ソースコードに特殊なコメントを記載しておくと、ツールでドキュメント生成出来る。Javaのjavadocや、Python等々サポートしている言語は多々ある有りますね。出自はクヌース先生の文芸的プログラミングで…

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

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…