Random 为什么rand use语句在rust中有效?

Random 为什么rand use语句在rust中有效?,random,rust,scope,traits,Random,Rust,Scope,Traits,按照Rust book中的示例,使用其建议的rand=“0.6.0”,我得到如下代码: use rand::Rng; fn main() { let secret_number = rand::thread_rng().gen_range(1, 101); println!("The secret number is: {}", secret_number); } 这本书后面关于模块的章节中所说的一切都表明,如果你做一个,使用rand::Rng如上所述,

按照Rust book中的示例,使用其建议的
rand=“0.6.0”
,我得到如下代码:

use rand::Rng;

fn main() {
    let secret_number = rand::thread_rng().gen_range(1, 101);

    println!("The secret number is: {}", secret_number);
}
这本书后面关于模块的章节中所说的一切都表明,如果你做一个
,使用rand::Rng
如上所述,您将能够使用
Rng
。如果恰好是模块本身,则可以将子模块与
Rng::submodule
一起使用。如果这恰好是一个类型,您只需将其用作
Rng
。然而,在上面的代码中,我们从不在任何地方使用
Rng

相反,我们使用看似无关的
rand::thread\u rng()
。据我所知,既然
rand
是顶级板条箱的名称,我们应该能够使用它,即使没有
use
语句,它似乎没有任何作用

相反,由于某种原因,如果没有
use
语句,程序将无法编译。这真令人困惑。我希望这本书能更好地解释那里发生的事情

为什么我们需要使用声明?我们为什么不使用
Rng
?它与
rand::thread\u rng()
有什么关系


我有Python的背景,所以我习惯了这样的想法:如果你导入
线程
,你就是在使用
线程。如果导入
django.utils
,则使用的是
django.utils.something
。这看起来像是导入了
django.utils
,您使用的是完全不相关的
django.url

除非trait在范围内,否则无法调用trait方法

然而,在上面的代码中,我们从不在任何地方使用
Rng

你正在使用。是由trait定义的trait方法,因此必须在范围内才能调用


基本细节:返回哪个实现并得到一个实现,因为通用的毯子impl。

我相信你的答案在技术上是准确的,但是作为一个刚刚开始学习生锈的人,尽管我已经读了这本书的大部分内容,但我仍然迷路了。根据我收集的信息,
rand::thread\u rng()
函数返回一个
ThreadRng
结构,该结构接受泛型类型
R
,并通过在其上实现
rng
特性来尝试向该结构添加方法。像这样的?奇怪的是,作为函数的用户,我应该关心function.TL的内部结构;DR:您正在尝试使用trait方法,traits中的项目只有在trait在范围内时才能使用。@mcarton哇,这是有道理的。Thanks@John我已经更新了我的答案更简单,更直接,如果它回答你的问题,请考虑接受它,谢谢!太棒了-谢谢!实际上你在这里问了两个问题。1.为什么
Rng
use
一起导入?2.为什么我们可以使用
线程\u rng
,尽管它尚未导入?下面的答案和评论中第一个问题的答案——你需要导入特征才能使用它们。第二个问题的答案是,您在
Cargo.toml
中声明您的依赖关系,并且由于
rand
在其中,因此您可以在该板条箱中使用完全限定路径,而无需任何
use
语句使用
并不是真正的“导入”任何东西–它只是在当前名称空间中插入一个快捷方式。