6章頭から6章途中まで。
Rustの基本構文について。
といっても、サンプルとして既出のものがほとんど。
それぞれ補足された感じ。
結局ほとんどコードを書かずに読むだけスタイルで進めてしまった。
全構文を使って遊べる無茶なサンプルコードがあれば楽しく学べるかも。
というか、REPLが欲しい。
と思ったら、あった。
と思ったら、ビルドエラーになった。-> 課題参照
ビルド通して使ったら、遅い。
コンパイルしてそうだから仕方ない。普通にエディタで書こう。
明日からいよいよ7章の所有権に突入。
7章だけで3日くらいかかる予感。
おぼえがき
- ブロックコメント
/**/
は入れ子にできる ->/* /* */ */
- 文は
()
を返す。文末には;
を付ける。- 文は宣言文と式文に分解され、式文には
;
が省略できるものもあう
- 文は宣言文と式文に分解され、式文には
- Rustでは値を返すためのreturnは使わないのが慣習
- 呼び出し元に制御を返さない関数=発散する関数と呼ぶ
fn func() -> !{ std::process::exit(0); }
- プロセスの終了、無限ループ、CPUを待機状態(割り込み待ち)にさせるときに使う
- メソッドの第1引数はレシーバ(Pythonっぽい)。型は省略可
impl
内に実装する- 本来は
(&obj).method()
という形だけどobj.method()
でいいとのこと(コンパイラが頑張ってくれる)
- 構造体などデータ型に紐付けた関数を関連関数という
- 変数のスコープは導入したブロック内
{}
のみ - 束縛は同じ名前に対して何度でもできるっぽい(シャドウィング)
- 定数もある
const CONST_VAL: u32 = 777;
- Cでいうマクロ定数っぽい
- コンパイル時に1度だけ計算。参照先にはその計算結果が埋め込まれる
- static変数もある
static STATIC_VAL: u32 = 777;
- mutableなstatic変数も定義できる
- 初期値はコンパイル時に確定する値にすること
- 代入は
unsafe
で囲むこと (他スレッドで変更される可能性があるため)
static変数とは?
という説明が最初にないのが不思議
- mutableなstatic変数も定義できる
- 多くの2項演算子は異なる型同士の演算を許可してないっぽい (型強制もなしか)
- 右シフトは符号なし型に対しては論理右シフト、符号あり型に対しては算術右シフトになるっぽい
- if は式
- true節とfalse節の返す値の型は同じじゃなきゃダメ
- false節を省略した場合のfalse節の返す値は
()
- false節を省略した場合のfalse節の返す値は
- true節とfalse節の返す値の型は同じじゃなきゃダメ
- match は式
- if let式はmatch式の糖衣構文
- loop は式
loop {break ret_val;}
- continueもある
- while は式
- breakやcontinueも使える
- ただし、breakで値を返すことはできない
- while式が返す値は常に
()
- breakやcontinueも使える
- while let式もある
- パターンにマッチしたときは繰り返し、マッチしなかった場合はループを抜ける
- breakやcontinueも使えるが、返す値は常に
()
- for は式
- コレクションに対してループ
for elm in vector.iter() { }
- breakやcontinueも使えるが、返す値は常に
()
- クロージャ作成時に環境の変数は「貸す」ことになるっぽい
- 元のスコープでクロージャに貸した変数の値を変えようとするとビルドエラーになる
move
キーワードを使えば、値がコピーされる(Copyトレイト要)let plus_one = move |x| { x + one };
- 元のスコープでクロージャに貸した変数の値を変えようとするとビルドエラーになる
- アトリビュート コンパイラに対する指示
- モジュール分割
mod mod_name { fn func() {} }
mod_name::func()
で呼び出す- ただし、pub付けないとアイテムは非公開となり、他モジュールから呼び出せない
pub(公開場所)
で、細やかなアクセス制御ができるっぽいpub(crate)
pubを付けたアイテムと同モジュールの含むクレートに対して公開pub(in app::network)
app::networkモジュールに対して公開crate
はルートモジュールcrate::network::ping()
src/network.rs
で、networkモジュールとして取り扱われる- ただし、モジュール使用側で
mod network
という指定が必要
- ただし、モジュール使用側で
課題
- static変数の命名規則は大文字区切り?
- パターンの使い方はもっと色々見た方が良さげ
evcxr_repl
というREPLがあるっぽいけどビルドエラー
参考
- 作者: κeen,河野達也,小松礼人
- 出版社/メーカー: 技術評論社
- 発売日: 2019/05/08
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る