RustLadies第3回目を開催しました!【イベントレポ】
RustLadiesとは
Rustに興味がある女性で集まり、ゆるっとRustを楽しもう〜というコミュニティです。
Rustにハマった筆者が、女性同士でRustを楽しみながら勉強したい!ついでに女性エンジニア同士の繋がりも増やしたい!というモチベーションで立ち上げたコミュニティです。
多分日本初のRust女性コミュニティです!🦀
詳しい経緯はこちらの記事でお話ししています!
過去の開催については下記をご覧ください。
ちなみに来月第4回目やります!
第3回目、テーマは「Rustにおける変数、関数、データ型」
RustLadiesでは、第2回目からRustの公式チュートリアル「The Book」をみんなで進めています。
今回はいよいよ第3章へ入って行きました。
変数や関数をどう定義するのか、主なデータ型や制御文にはどういったものがあるのかを解説する章です。
得られた学び
定数に代入しようとするとエラーになる。
定数はconst
キーワードで宣言できます。
const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;
定数には代入ができません。
代入しようとするとエラーが発生します。
const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;
println!("The value of x is: {THREE_HOURS_IN_SECONDS}");
// The value of x is: 10800
THREE_HOURS_IN_SECONDS = 1;
println!("The value of x is: {THREE_HOURS_IN_SECONDS}");
// invalid left-hand side of assignment
mut
では値は変更できても型は変えられない
Rustの変数はデフォルトで不変ですが、mut
をつけることで可変にすることができます。
下記の例の場合、aはi32
型が入っていますが、その後str
型が入っているためエラーになっています。
let mut a = 10;
a = "hello";
// mismatched types
度々RustLadies中でも「mut
は型まで変えられるの...?」と疑問が浮かんでいましたが、今回解決することができました。
同じ名前の変数を定義すると、最後に入れた値になる(シャドーイング)
Rustの変数を宣言する際、同じ変数名を使って変数を宣言すると、新しい変数で古い変数を覆い隠す(シャドーイング)ことができます。
let x = "hello";
println!("The value of x is: {x}");
// The value of x is: hello"
let x = 6;
println!("The value of x is: {x}");
// The value of x is: 6"
let x = 8.12;
println!("The value of x is: {x}");
// The value of x is: 8.12"
同じ変数名で違う型の値にすることも可能です。
しかしmut
キーワードをつけていないので、値の中身が変わっているだけで再代入はできません。
let x = 6;
println!("The value of x is: {x}");
let x = 8.12;
println!("The value of x is: {x}");
// The value of x is: 8.12"
x = 10;
// cannot assign twice to immutable variable `x`
parse()
はstr型にだけ使える
Rustではシングルクォーテーションで囲んだ値はchar
型、ダブルクォーテーションで囲んだ値はstr
型となります。
2章の数当てゲームでお世話になったparse()
メソッドはstr型でのみ使えるため、下記のコードで実行するとエラーが発生します。
let x = 'apple';
let parsed_x = x.parse();
// error: character literal may only contain one codepoint
ちなみにエラーとともに、ダブルクォーテーションつけてね!とhelpもくれます。優しい。
help: if you meant to write a string literal, use double quotes
|
11 | let x = "apple";
| ~ ~
タプルは各要素の型が異なっても使える
タブルの値は全て同じ型でなくてもコンパイルが通ります。
let tup = (500, 6.4, 1, "hello");
タプルの中身を取り出すときは、tup.3
のように、変数名の後に.
をつけて、インデックスを指定します。
println!("{}", tup.3);
// hello
配列は全て同じ型じゃないとエラーになる
Rustでは配列に入る要素は全て同じ型である必要があり、長さは固定されます。
例えば次のような配列があった場合、要素はi32型
、要素の数は5つにしなければなりません。
let a: [i32; 5] = [1, 2, 3, 4, 5];
要素を取り出すときは、[]
でインデックスを囲みます。
println!("{}", a[0]);
// 1
if文の結果を返す値は、true時の値の型が優先される
if文によって返す値を設定できます。
下記の例だと、もしcondition
がtrue
なら真、false
なら偽が返ってきます。
このとき、trueの結果にもしi32
型の値を入れた場合、falseの結果もi32
型にする必要があります。
let condition = true;
let result: char = if condition { '真' } else { '偽' };
// trueだった場合の値の方にfalseの結果の型は縛られる
let condition = true;
let number: i32 = if condition { 5 } else { '偽' };
// mismatched types
ちなみにchar
型の場合、as i32
のようにすれば、コンパイルを通すことができるようです。
help: you can cast a `char` to an `i32`, since a `char` always occupies 4 bytes
|
51 | let number: i32 = if condition { 5 } else { '偽' as i32 };
|
やってみた結果。
本当に通ってる...
let condition = false;
let number: i32 = if condition { 5 } else { '偽' as i32 };
println!("the value of number is {}", number);
// the value of number is 20605
値を返さないのが文。値を返すのが式。
let y = 6; //文
{
let y = 6;
z = y * 6
}
// {}のブロックは式
値を返すものは式なので、セミコロンをつけません。
()
が返る
式の中で最後の値にセミコロンをつけるとRustでは、return
をつけなくても関数に戻り値を設定することができます。
関数の中での最後の式の値が戻り値になります。
下記の例だと、five()
の返り値は5となります。
fn five() -> i32 {
5
}
もし5の後に;
をつけた場合はどうなるのでしょうか。
fn five() -> i32 {
5;
}
末尾にreturnがないため、暗黙的に()
が返ってきます。
error[E0308]: mismatched types
--> src/main.rs:70:14
|
70 | fn five() -> i32 {
| ---- ^^^ expected `i32`, found `()`
| |
| implicitly returns `()` as its body has no tail or `return` expression
71 | 5;
| - help: remove this semicolon to return this value
()
が何かを調べてみると空のタプルのことで、戻り値がないよ、というのを表現しているようです。
()、つまり空のタプルとして表現されています。それゆえに、何も戻り値がなく、これが関数定義と矛盾するので、 結果としてエラーになるわけです。
https://doc.rust-jp.rs/book-ja/ch03-03-how-functions-work.html
次回!!!
ここまで読んでいただきありがとうございました!
冒頭でもお話ししましたが、第4回目やります!!!!!!!!!!!
年内最後の開催に、第4章を進めます!!!!
Rustが気になる女性の方ならどなたでも大歓迎です!ぜひお気軽にお越しください!!
Discussion