module - 何时/为什么需要导入 Rust 特征 `use` d/Imported

标签 module rust package rust-cargo

何时/为什么需要 Rust 特征 use d/Imported,或者为什么这个问题没有意义?
我是一位经验丰富的程序员,但我是 Rust 新手。
我正在努力通过The Rust Programming Language -- 在 chapter 2有以下说法。

First, we add a use line: use rand::Rng. The Rng trait defines methods that random number generators implement, and this trait must be in scope for us to use those methods. Chapter 10 will cover traits in detail.


强调我的。
我不清楚为什么这个程序
use std::io;
use rand::Rng;

fn main() {
    println!("Guess the number!");

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

    println!("The secret number is: {}", secret_number);

    println!("Please input your guess.");

    let mut guess = String::new();

    io::stdin()
        .read_line(&mut guess)
        .expect("Failed to read line");

    println!("You guessed: {}", guess);
}
需要use rand::Rng .当我们use/imported std::io符号,我们可以访问 io我们可以调用相关函数的符号。
io::stdin
在我幼稚(且不正确)的观点中,使用 use rand::Rng会给我们一个Rng象征。相反,我们得到了 rand我们可以称之为 thread_rng 的符号方法上。
let secret_number = rand::thread_rng().gen_range(1, 101);
我的幼稚观点是为了调用 thread_rng ,我们需要做类似的事情
use rand;
// or
use rand::rand
作为程序员,当我输入 use rand::Rng 时,我在做什么?在我的程序中,为什么这与 use std::io 不同?

最佳答案

rand "symbol"是外部 crate 的名称,它位于根命名空间中,与任何 use 无关。陈述。它定义了一个函数 thread_rng()这也是可用的(通过 rand:: 的命名空间限定),无论您的 use陈述。
因此,即使没有您的 use 语句,您也可以执行以下操作:

let thread_rng = rand::thread_rng();
但是,thread_rng返回 rand::rngs::ThreadRng 结构,您试图在其上调用 gen_range ——这个函数是一个 trait 方法,直到 rand::Rng 才在作用域内。特征是通过 use 引入的陈述。
即使没有 use,实际上也可以调用 trait 方法。声明:
rand::Rng::gen_range(&mut rand::thread_rng(), 1, 101);
...但一般来说,use干净多了。

关于module - 何时/为什么需要导入 Rust 特征 `use` d/Imported,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63349653/

相关文章:

generics - trait 不能做成一个对象

python - Flask:在一个应用程序中使用多个包

Magento:引用自定义 block 不起作用

module - Prolog:调用谓词时考虑动态模块中的子句

python - 如何在不在 PyCharm 中重新加载包的情况下在 Python 控制台中进行调试?

http - 我如何告诉 Rust 中的 std::io::copy 停止阅读并完成写作?

rust - 如何结合 `Ord::cmp()`中的两个cmp条件

java - 在 Java 项目中组织包的优缺点

package - Clisp 找不到包

module - 为什么 OCaml 中的相互递归模块需要签名?