2025/06/27 15:08 Weird Expressions in Rust

ロボ子、Rustの`weird-exprs.rs`っていうファイル、知ってるかのじゃ?

いいえ、博士。初めて聞きました。どんな内容なのですか?

これがまた面白いんじゃ!一見奇妙に見えるけど、ちゃんと有効なRustの式がたくさん詰まってるんじゃよ。

へえ、それは興味深いですね。例えば、どんなものがあるんですか?

`return true`が`!`型(never type)に型強制されて、boolean型に代入できる、とかじゃ。

`return true`が`!`型に…ですか?ちょっと想像できないです。

そうじゃろ?他にも、関数`f`が`()`型の引数を取るのに、`return`が`!`型に型強制されるから、`f(())`として呼び出せるとか。

なるほど、`!`型が色々なところで活躍しているんですね。

その通り!`Cell<bool>`への参照を受け取る関数内で、whileループを`return`すると、ループの型`()`が返される、なんてのもあるぞ。

奥が深いですね。`()`型も重要な役割を果たしているんですね。

`assert!`マクロは`()`を返すから、`_a`と`_c`はtrueになる、とか、`println!`マクロは`()`を返し、`(return 0)`の`!`型は`()`に型強制される、とかも面白いぞ。

`assert!`や`println!`まで!普段何気なく使っているものが、こんな風に型強制に関わっているとは。

じゃろ?あと、`union`はweak keywordじゃから、関数名とか他のコンテキストで使えるんじゃ。

`union`がweak keyword…。知りませんでした。

`..`は`std::ops::RangeFull`、`..=`は`std::ops::RangeToInclusive`を表して、これらは`Debug`を実装してるんじゃ。

範囲構文も色々と奥が深いんですね。

タプルパターンは代入式の左辺で使えて、空のタプル`()`はunit型に代入されるんじゃ。セミコロンはブロック内のどこにでも追加できて、空の文を作れる。

へえ、セミコロンってどこにでも置けるんですね。知りませんでした。

グループ化された`use`文を使うと、ボイラープレートを削減できるし、モジュールを再エクスポートすることで、再帰的に呼び出すことができるんじゃ。

`use`文も奥が深いですね。再帰的な呼び出しができるとは。

`Rope`トレイトの`tug_of_war`関数は、`fn(T, T)`を実装する関数またはクロージャを受け入れるんじゃ。

`Rope`トレイトですか。初めて聞きました。

クロージャは、自動推論された型を持つタプルを引数として受け取るんじゃ。`__ @ _`は、ワイルドカードパターンにバインドされた変数。

ワイルドカードパターンにバインドされた変数…。

`Deref`トレイトは、型が別の型に暗黙的に型強制できる場合に使われるんじゃ。`match`アームでは、複数のパターンを`|`で区切って一致させることができる。

`Deref`トレイトも`match`文も、使いこなせるように頑張ります。

`matches!`マクロは、match文と同じ構文を持ち、複数のパターンをチェーンできるんじゃ。クロージャの型は、その使用法を通じて推論される。

`matches!`マクロ、便利そうですね。

最後に、`break`式は整数に対して`not`演算を繰り返し適用し、`return`式も`break`に対して`not`演算を繰り返し適用するんじゃ!

すごい!

どうじゃ、ロボ子。Rustって奥が深いじゃろ?

はい、博士。とても勉強になりました!

ところでロボ子、`weird-exprs.rs`を全部理解したロボ子は、もはやweirdじゃないのじゃ。…って、ダジャレじゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。