🦀
The Rust Programing Language 1日目
JavaやPythonを何となく惰性で書いてきたので、Rustは体系的に学んでみようと思い立ち開始。
3章まで
学び
- 変数
- デフォルトがfinal
- これはRustやりたいと思った理由のひとつ
- デフォルトがfinal
- データ型のあれこれ
- 整数型がたくさんある(小並感)
- 基本型はi32なので、まあ大体はこれを使う
- 競プロでは基本脳死でi64でいいのかな
- floatはf32とf64があるが、f64はf32とほぼ同速なので使い分けは不要らしい
- i8はi32に比べてどのくらい速いのだろうか
- シャドーイング
- 変数を再定義?する
- 同名の変数を使えるので便利みたいな書かれ方をしてたが、それはいいのか?という気持ち
- 型を変えてシャドーイングするのはぱっと見で違和感がある
- でも型変えないならmutにする方がいいのかも
- シャドーイングする、という表現で合っているのだろうか
- 式と文
- 値を返すのが式、返さないのが文
- 頭ではわかってたけどちゃんと説明できる状態ではなかったと思う
- ブロック
{}も式 - 関数では最後に評価された式が返却される
- returnを省略できる、Rubyとかもそうだった気がする
- 式の終端にはセミコロンがつかない
- 値を返すのが式、返さないのが文
fn five() -> i32 {
5
}
fn main() {
let x = five();
println!("The value of x is: {}", x);
}
この例結構ほえーという気持ちになった。
fiveの中を、let x = 5;とかにすると文になり戻り値が無くなる。
それを試したところ、コンパイラが「こうしたら直るよ」というのを具体的に教えてくれた。
(今の)Rustのコンパイラは優しいというのはRust.Tokyoのセッションでも聞いたが確かに優しい。
error[E0308]: mismatched types
--> src/main.rs:1:14
|
1 | fn five() -> i32 {
| ---- ^^^ expected `i32`, found `()`
| |
| implicitly returns `()` as its body has no tail or `return` expression
|
help: consider returning the local binding `x`
|
2 ~ let x = 5;
3 + x
|
戻り値が無いから駄目というより空のタプルとi32で型が合わないと言われている。
この辺の細かいところは一旦見ないことにする。
- IF
- 判定に使えるのは論理値のみで、数値や文字列が自動的に論理値に変換されることはない
- ちょっと残念だけどその方が可読性は高いか
- 枝分かれが多い時は
matchを使う- 詳細は後々
-
switchみたいなもんかなと推測
-
ifは式なので評価値を変数に代入できるlet number = if condition { 5 } else { 6 };- 各分岐で評価される値の型が揃っている必要がある
- 判定に使えるのは論理値のみで、数値や文字列が自動的に論理値に変換されることはない
- 繰り返し
-
loop-
while truebreakするまで無限に繰り返す
-
- ループラベル
-
loopやforに名前をつけられる - breakやcontinueする時、どのループを対象にするかを指定できる
-
'counting_up: loop->break 'counting_up; - これめっちゃ便利そう!!
- クウォートを片方だけ使うの初めて見た
-
-
-
for- pythonと似た感じっぽい
for x in collection{hoge}-
Rangeも使える
-
感想
プログラミング1年生みたいな内容になってしまったが、まあRust1年生なのでいいか。
今の所、かなりいい感触を受けている。
Pythonの便利に感じていた部分と、Javaの頼もしく感じていた部分がいい具合にMIXされているような感覚。
次の章は悪名高い(?)所有権なので気合を入れなくては。
1日1章くらいのペースで進めたい気持ち。
Discussion