按照Rust书中使用其建议的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);
}
这本书后面关于模块的章节中所说的一切都表明,如果你像上面那样做use rand::Rng;
,你将能够使用Rng
。如果这恰好是一个模块本身,您可以使用Rng::submodule
的子模块。如果这恰好是一个类型,您只需使用它作为Rng
。然而,在上面的代码中,我们从未在任何地方使用Rng
。
相反,我们使用看似无关的rand::thread_rng()
。据我所知,由于rand
是顶级crate的名称,我们应该能够使用它,即使没有use
语句,它似乎没有做任何事情。
相反,由于某种原因,如果没有use
语句,程序将无法编译。这真的很令人困惑。我希望这本书能更好地解释那里发生了什么。
为什么需要use语句?为什么我们不使用Rng
?它与rand::thread_rng()
有什么关系?
我来自Python背景,所以我习惯了这样的想法,如果你导入threading
,你正在使用threading.something
。如果导入django.utils
,则使用的是django.utils.something
。这看起来像是一个django.utils
的导入,而你使用的是完全不相关的django.urls
。
你不能调用trait方法,除非trait在作用域中。
然而,在上面的代码中,我们从未在任何地方使用
Rng
。
您正在使用Rng
。gen_range()
是一个由Rng
定义的trait方法,所以Rng
必须在你调用gen_range()
的作用域中。
基本细节:rand::thread_rng()
返回ThreadRng
实现RngCore
,并获得Rng
实现,因为通用毯子implimpl<R> Rng for R where R: RngCore + ?Sized
。