各位rust大牛好,小弟我已经粗略看完了rust的文档,但存在一个rust导入的问题一直不能理解。
例如官方文档中的猜数字游戏的例子中:
use rand::Rng;
fn main() {
//...省略
let secret_number = rand::thread_rng()::gen_range(1..101);
//...省略
}
我查阅了 rand
的源码,发现关系如下:
rand::thread_rng()
得到的是结构体ThreadRng
,它实现了traitrand::RngCore
;- 而方法
gen_range
是由traitrand::RngCore
的子traitrand::Rng
定义的,并且rand::Rng
定义下面有一句impl<R: RngCore + ?Sized> Rng for R {}
。
- 请问我的理解是为所有实现
RngCore
的东西实现Rng
这样对吗? - 我删除掉
use rand::Rng;
和::gen_range(1..101);
,仅保留rand::thread_rng();
,程序可以正常运行,也就是说只要craterand
添加进依赖中,rand就可以在程序中使用是吗? - 为什么trait
Rng
必须使用use引入才可以使用方法gen_range
呢?use rand::Rng;
时发生了什么?
我工作中是使用Python的,在Python中使用外部的东西,都必须导入这个关键字,跟Rust的外部导入有很大的不同。
感谢大牛们的解惑!
1
共 2 条评论, 1 页
评论区
写评论感谢!有点明白了。 在
ThreadRng
的定义下面直接实现的impl RngCore for ThreadRng
,我看到vscode中有RngCore.next_u32
的补全,以为不需要引入RngCore
,刚试了下不能运行,原来也必须引入这个traitRngCore
。谢谢!
--
👇
zombie110year: Rust 需要显式引入 Trait 才能使用这个 Trait 拥有的方法。
Rust 需要显式引入 Trait 才能使用这个 Trait 拥有的方法。