rust 为什么在第7.4章的代码段中定义了'thread_rng

rqdpfwrv  于 2023-03-18  发布在  其他
关注(0)|答案(2)|浏览(191)

我目前正在阅读rust关于use的书中的chapter 7.4,但我不理解其中的片段:

use rand::Rng;

fn main() {
    let secret_number = rand::thread_rng().gen_range(1..=100);
}

我不明白为什么使用use rand::Rng(将结构体Rng放入作用域),而是rand::thread_rng()的用法。我猜thread_rng是一个Rng构建器,但这在我看来很奇怪,不明确。
我只希望使用use rand,因为thread_rngrand命名空间中,而且我不明白它是如何工作的,因为rand本身不在作用域中

0ve6wy6x

0ve6wy6x1#

use rand;将是无用的,因为rand已经在范围内。
但是,rand::Rng is a trait。它的一个方法是gen_range()。只有当trait在作用域中时,才能调用trait方法。如果删除此use,则会出现错误:

error[E0599]: no method named `gen_range` found for struct `ThreadRng` in the current scope
   --> src/main.rs:2:44
    |
2   |     let secret_number = rand::thread_rng().gen_range(1..=100);
    |                                            ^^^^^^^^^ method not found in `ThreadRng`
    |
   ::: /playground/.cargo/registry/src/github.com-1ecc6299db9ec823/rand-0.8.5/src/rng.rs:129:8
    |
129 |     fn gen_range<T, R>(&mut self, range: R) -> T
    |        --------- the method is available for `ThreadRng` here
    |
    = help: items from traits can only be used if the trait is in scope
help: the following trait is implemented but not in scope; perhaps add a `use` for it:
    |
1   | use rand::Rng;
    |
t5zmwmid

t5zmwmid2#

当你给你的Cargo.toml添加一个依赖项,比如rand = *,它会自动进入你的crate的全局作用域,这就是为什么你可以把它当作rand::thread_rng()来使用。
不过,这只适用于rust 2018,在此之前,您需要一个extern crate rand;语句,它会将兰德带入作用域,而现在,它刚刚进入全局作用域。

相关问题