为什么这个 rand use 语句在 Rust 中有效?

Joh*_*ohn 4 random scope traits rust

按照 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);
}
Run Code Online (Sandbox Code Playgroud)

本书后面关于模块的章节中所说的一切都表明,如果您use rand::Rng;按上述方式执行 a ,您将能够使用Rng. 如果这恰好是一个模块本身,您可以使用带有Rng::submodule. 如果这恰好是一种类型,则只需将其用作Rng. 然而,在上面的代码中,我们从不使用Rng任何地方。

相反,我们使用看似无关的rand::thread_rng(). 据我了解,既然rand是顶级 crate 的名称,我们应该能够使用它,即使没有use似乎没有做任何事情的语句。

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

为什么我们需要 use 语句?为什么我们不使用Rng?它与 有什么关系rand::thread_rng()

我来自 Python 背景,所以我习惯于这样的想法:如果您导入threading,那么您正在使用threading.something. 如果您 import django.utils,则您正在使用django.utils.something. 这似乎是django.utils您使用完全不相关的django.urls.

kfe*_*v91 5

除非特征在范围内,否则您不能调用特征方法。

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

您正在使用Rng. gen_range()是由 trait 定义的 trait 方法,Rng因此Rng必须在您调用的范围内gen_range()

本质细节:由于通用的整体 impl ,rand::thread_rng()返回ThreadRng哪个实现RngCore并获得一个Rng实现impl<R> Rng for R where R: RngCore + ?Sized

  • TL;DR:您正在尝试使用特征方法,并且只有当特征在范围内时才能使用特征中的项目。 (4认同)