Sibainu Relax Room

愛犬の柴犬とともに過ごす部屋

RUST use crateについて

おお分かったかと驚いている柴犬です。

概要

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_househostingも指定しないといけませんでした。
ありがたいことに、この手続きを簡単化する方法があります。
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 とし、次のコードを実行してみます。

copy

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::*はパスをとおして表現を簡単化するため使っています。