おお分かったかと驚いている柴犬です。
概要
2023年1月18日投稿の「RUST 列挙型連結リスト」中で次の課題とした「use crate::Rist」は何?としたことについて自分なりの理解ができましたので投稿します。
useキーワードでパスをスコープに持ち込む
RUSTの次のホームページの中で
https://doc.rust-jp.rs/book-ja/ch07-04-bringing-paths-into-scope-with-the-use-keyword.html
次のように書かれています。
これまで関数呼び出しのために書いてきたパスは、長く、繰り返しも多くて不便なものでした。
例えば、Listing 7-7 においては、絶対パスを使うか相対パスを使うかにかかわらず、add_to_waitlist
関数を呼ぼうと思うたびにfront_of_house
とhosting
も指定しないといけませんでした。
ありがたいことに、この手続きを簡単化する方法があります。
use
キーワードを使うことで、パスを一度スコープに持ち込んでしまえば、それ以降はパス内の要素がローカルにあるかのように呼び出すことができるのです。
Listing 7-11 では、crate::front_of_house::hosting
モジュールをeat_at_restaurant
関数のスコープに持ち込むことで、eat_at_restaurant
において、hosting::add_to_waitlist
と指定するだけでadd_to_waitlist
関数を呼び出せるようにしています。
このことから、次の記述は
use crate::Rist::*;
Rist の列挙子の呼び出しを簡単化(Rist::ConsをCons)するために記述していることになります。
use crate::Rist::*を削除してみる
確かめてみます。
単にuse crate::Rist::*削除
単に use crate::Rist::* 行を削除して実行してみます。
enum Rist {
Cons(u32, Box<Rist>),
Nil,
}
impl Rist {
fn new() -> Rist {
Nil
}
fn prepend(self, elem: u32) -> Rist {
Cons(elem, Box::new(self))
}
以下省略
このスコープに見つからないとエラーになりました。
そして、use crate::Rist::Nil、use crate::Rist::Consを使うように促しています。
Nil、Consに Rist:: を付加
次に Rist:: を付加してみます。
use crate::Rist::* を削除して、Nil という呼び出しを Rist::Nil に、Cons という呼び出しをRist::Cons とし、次のコードを実行してみます。
enum Rist { Cons(u32, Box<Rist>), Nil, } impl Rist { fn new() -> Rist { Rist::Nil } fn prepend(self, elem: u32) -> Rist { Rist::Cons(elem, Box::new(self)) } fn len(&self) -> u32 { match *self { Rist::Cons(_, ref tail) => 1 + tail.len(), Rist::Nil => 0 } } fn stringify(&self) -> String { match *self { Rist::Cons(head, ref tail) => { format!("{} {}", head, tail.stringify()) }, Rist::Nil => { format!("Nil") }, } } } fn main() { let mut list = Rist::new(); list = list.prepend(1); list = list.prepend(2); list = list.prepend(3); println!("linked list has length: {}", list.len()); println!("{}", list.stringify()); }
何の問題もなくコンパイルでき実行できました。
結論
use crate::Rist::*はパスをとおして表現を簡単化するため使っています。