👩

RustLadies第3回目を開催しました!【イベントレポ】

2024/11/17に公開

RustLadiesとは

Rustに興味がある女性で集まり、ゆるっとRustを楽しもう〜というコミュニティです。

Rustにハマった筆者が、女性同士でRustを楽しみながら勉強したい!ついでに女性エンジニア同士の繋がりも増やしたい!というモチベーションで立ち上げたコミュニティです。

多分日本初のRust女性コミュニティです!🦀
https://rustladies.connpass.com/

詳しい経緯はこちらの記事でお話ししています!
https://zenn.dev/2323_code/articles/e9f5e51438adae

過去の開催については下記をご覧ください。

https://zenn.dev/2323_code/articles/9635b3e8227973

ちなみに来月第4回目やります!
https://rustladies.connpass.com/event/337620/

第3回目、テーマは「Rustにおける変数、関数、データ型」

RustLadiesでは、第2回目からRustの公式チュートリアル「The Book」をみんなで進めています。

https://doc.rust-lang.org/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文によって返す値を設定できます。
下記の例だと、もしconditiontrueなら真、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が気になる女性の方ならどなたでも大歓迎です!ぜひお気軽にお越しください!!
https://rustladies.connpass.com/event/337620/

Discussion