【问题标题】:When/Why do Rust Traits Need to be `use`d/Imported何时/为什么需要“使用”/导入 Rust 特征
【发布时间】:2020-08-25 08:51:11
【问题描述】:

Rust 特征何时/为什么需要 used/Imported,或者为什么这个问题没有意义?

我是一位经验丰富的程序员,但我是 Rust 新手。

我正在通过The Rust Programming Language 工作——在chapter 2 中有以下声明。

首先,我们添加一个use 行:use rand::RngRng trait 定义了随机数生成器实现的方法,这个 trait 必须在我们使用这些方法的范围内。第 10 章将详细介绍特征。

强调我的。

我不清楚为什么这个程序

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 不同?

【问题讨论】:

    标签: module rust package rust-cargo


    【解决方案1】:

    rand“符号”是外部 crate 的名称,它位于根命名空间中,与任何 use 语句无关。它定义了一个函数thread_rng(),它也可用(通过rand:: 的命名空间限定),而与您的use 语句无关。

    因此,即使没有你的 use 语句,你也可以这样做:

    let thread_rng = rand::thread_rng();
    

    但是,thread_rng 返回一个 rand::rngs::ThreadRng 结构,您正尝试在其上调用 gen_range——并且 this 函数是一个 trait 方法,它不在范围内直到 rand::Rng trait 被 use 语句引入。

    即使没有use 语句,实际上也可以调用 trait 方法:

    rand::Rng::gen_range(&mut rand::thread_rng(), 1, 101);
    

    ...但总的来说,use 更干净。

    【讨论】:

    • 是否为ThreadRng 实现了Rng trait 的gen_range 方法?我在 rand crate 中找不到任何证据。即使是这样,为什么我们在结构上定义方法时仍然需要use trait?是为了帮助 Rust 进行命名空间限定吗?
    • 我阅读了文档,我的理解是Rng trait 会自动为实现 RngCore 特征的任何类型实现。这回答了我在上面评论中的问题的第一部分,尽管我不确定我的理解是否正确。
    • 所以要使用 mod,调用者必须知道类型 impl 的哪个特征?即使没有冲突?生锈很奇怪
    • 哦,我明白了。 pub mod trait 可以解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多