Rustのインストール
公式サイトに記載の方法で実行。
https://www.rust-lang.org/ja-JP/install.html
Rustのプログラム実行
- コンパイル: $ rustc
REPL
https://github.com/murarth/rusti で非公式だけどある様子。ただ2016-08-01以前のものを使用する必要がありそうで悩ましい。
repl.it というサイトがあるみたい
文法
コメント
一行コメント
// 一行コメント
複数行コメント
/*
複数行のコメントが
ここで書ける
*/
ドキュメンテーションコメントなるものもある様子。markdown記法が使える。
/// 一行のドキュメンテーションコメント
//! それを含んでいる要素(例えばクレート、モジュール、関数)にコメントを付けます。
//! 一般的にはクレートルート(lib.rs)やモジュールルート(mod.rs)の中で使われる
変数
変数の宣言。デフォルトはイミュータブル。実際に使用される時は値で初期化されている必要がある。
let x = 5; // イミュータブル
let mut y = 6; // ミュータブル
パターン
let (x, y) = (1, 2);
型注釈
//x
は型i32
を持つ束縛で、値は 5 である。
let x: i32 = 5;
スコープとシャドーイング
rubyとちょっと感覚が違うのは *1 で値が書き換わってないところ。変化はスコープの中で閉じている理解。
let x: i32 = 8;
{
println!("{}", x); // "8"を印字する
let x = 12;
println!("{}", x); // "12"を印字する
}
println!("{}", x); // "8"を印字する *1
let x = 42;
println!("{}", x); // "42"を印字する
変数
Rustはすくなくとも一つの関数main関数がある
fn main() {
}
この中に処理を書いていく。引数を取る時は下記のように書く。
// x というなの i32 という型の引数
fn foo(x: i32) {
}
戻り値の型の指定
fn foo(x: i32) -> i32 {
}
リターン
関数の一番最後はreturnを書かない。早期リターンは以下のような感じ
fn foo(x: i32) -> i32 {
return x;
// このコードは走りません!
x + 1
}
関数ポインタ
関数の内容をへんすうにいれることが可能。
fn plus_one(i: i32) -> i32 {
i + 1
}
// without type inference
let f: fn(i32) -> i32 = plus_one;
// with type inference
let f = plus_one;
プリミティブ型
let x: bool = true; # 真偽値
let x = 'x' # 一文字
let i = 42 # 数値型 u => 符号なし / i => 符号あり / f => 小数点
配列
配列は [T; N]
という型を持つ。ジェネリクス<T>がまだよくわかってない。
let array = [0; 20];
let a = [1, 2, 3];
println!("a has {} elements", a.len()); // 表示
添字記法でも値を取り出せる。
let names = ["Graydon", "Brian", "Niko"]; // names: [&str; 3]
println!("The second name is: {}", names[1]);
スライス
様々なものからスライスを作るためには &
と []
の組合せを使うことができます。 &
はスライスが参照と同じであることを示し、 []
はレンジを持ち、スライスの長さを定義します。
let a = [0, 1, 2, 3, 4];
let complete = &a[..]; // aに含まれる全ての要素を持つスライス
let middle = &a[1..4]; // 1、2、3のみを要素に持つaのスライス
str
let string = "文字列"; // 文字列型
タプル
タプルは固定サイズの順序ありリスト。
let x = (1, "hello");
let x: (i32, &str) = (1, "hello"); // 型注釈付き。様々な方が混在できる。
// 値の取り出し
let tuple = (1, 2, 3);
let x = tuple.0;
let y = tuple.1;
let z = tuple.2;
println!("x is {}", x);