Closed13
Rustlings: enum 編
閑話休題
これ導入したらちょっと快適になった:
知り合いに VSCode を vim のキーバインドで使っている人はいるけど,自分は vim を vim-plug -> coc で VSCode っぽいスタイルに寄せる派だなぁ.
業務でコード書くときにもこれを導入したいくらい.
Enum は Struct の双対みたいなものだと思っている(直積型に対する直和型のようなものなので).
Rust では Struct に対して ::
の記法を用いると impl
で定義した関数を呼び出せるのに加えて,Enum に対しても ::
で何かができるらしい.オタクを飽きさせない仕組みがすごい.
error[E0599]: no variant or associated item named `Quit` found for enum `Message` in the current scope
--> exercises/enums/enums1.rs:12:31
|
7 | enum Message {
| ------------ variant or associated item `Quit` not found here
...
12 | println!("{:?}", Message::Quit);
| ^^^^ variant or associated item not found in `Message`
error[E0599]: no variant or associated item named `Echo` found for enum `Message` in the current scope
--> exercises/enums/enums1.rs:13:31
|
7 | enum Message {
| ------------ variant or associated item `Echo` not found here
...
13 | println!("{:?}", Message::Echo);
| ^^^^ variant or associated item not found in `Message`
error[E0599]: no variant or associated item named `Move` found for enum `Message` in the current scope
--> exercises/enums/enums1.rs:14:31
|
7 | enum Message {
| ------------ variant or associated item `Move` not found here
...
14 | println!("{:?}", Message::Move);
| ^^^^ variant or associated item not found in `Message`
error[E0599]: no variant or associated item named `ChangeColor` found for enum `Message` in the current scope
--> exercises/enums/enums1.rs:15:31
|
7 | enum Message {
| ------------ variant or associated item `ChangeColor` not found here
...
15 | println!("{:?}", Message::ChangeColor);
| ^^^^^^^^^^^ variant or associated item not found in `Message`
error: aborting due to 4 previous errors
For more information about this error, try `rustc --explain E0599`.
エラーメッセージをパッと読んだ限りだと,Message
という Enum 型に対して
Quit
Echo
Move
ChangeColor
をそれぞれ実装することを求められているように見える.
そういや Struct は完全にクラス扱いだったので ::
記法もインスタンス変数に対して呼び出せたけど,今回はクラスメソッド(の列挙体版)なので特にインスタンスらしきものはないと考えて良いのかな...?
いや,そんなことはないや.嘘嘘.
によると,new()
コンストラクタと同じレベルのスコープで call()
メソッドが定義できるらしい:
impl Message {
fn call(&self) {
// method body would be defined here
}
}
let m = Message::Write(String::from("hello"));
m.call();
とりあえず読んだ.
明日以降
に目を通しつつ,少しじっくり目に exercise に取り組む.
一旦,現時点での知識で太刀打ちできそうな箇所まで行く.
enum Message {
Quit,
Echo,
Move,
ChangeColor,
}
みたいな書き方が許されるのはほとんど C と同じだな.
enum 編あっさり終わった.フィーリング要素が強めになってきており若干不安.
の残りの節もコードだけ軽く目を通した.if let
みたいな糖衣構文は積極的に利用したい一方で何が素朴表現かってことを知っておくのが重要そう.
このスクラップは2022/04/03にクローズされました