< 返回版块

exidot 发表于 2021-06-16 10:49

Tags:use,导入,rust

各位rust大牛好,小弟我已经粗略看完了rust的文档,但存在一个rust导入的问题一直不能理解。

例如官方文档中的猜数字游戏的例子中:

use rand::Rng;

fn main() {
    //...省略

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

    //...省略
}

我查阅了 rand 的源码,发现关系如下:

  • rand::thread_rng() 得到的是结构体 ThreadRng ,它实现了trait rand::RngCore
  • 而方法 gen_range 是由trait rand::RngCore 的子trait rand::Rng 定义的,并且 rand::Rng 定义下面有一句 impl<R: RngCore + ?Sized> Rng for R {}
  1. 请问我的理解是为所有实现RngCore的东西实现Rng这样对吗?
  2. 我删除掉 use rand::Rng;::gen_range(1..101);,仅保留 rand::thread_rng();,程序可以正常运行,也就是说只要crate rand添加进依赖中,rand就可以在程序中使用是吗?
  3. 为什么trait Rng必须使用use引入才可以使用方法 gen_range 呢?use rand::Rng;时发生了什么?

我工作中是使用Python的,在Python中使用外部的东西,都必须导入这个关键字,跟Rust的外部导入有很大的不同。

感谢大牛们的解惑!

评论区

写评论
作者 exidot 2021-06-16 11:40

感谢!有点明白了。 在 ThreadRng 的定义下面直接实现的 impl RngCore for ThreadRng,我看到vscode中有RngCore.next_u32的补全,以为不需要引入 RngCore,刚试了下不能运行,原来也必须引入这个trait RngCore

谢谢!

--
👇
zombie110year: Rust 需要显式引入 Trait 才能使用这个 Trait 拥有的方法。

zombie110year 2021-06-16 11:11

Rust 需要显式引入 Trait 才能使用这个 Trait 拥有的方法。

1 共 2 条评论, 1 页