(WIP)Rust 基礎文法 メモ

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);