use和extern有什么区别?


81

我是Rust的新手。我认为这use用于将标识符导入当前作用域,extern并用于声明外部模块。但是这种理解(也许是错误的)对我来说没有任何意义。有人可以解释为什么Rust具有这两个概念,以及使用它们的合适案例是什么?


5
您指的是陈述extern crate foo;吗?板条箱和模块是Rust中的独立概念,您可能需要看一下“基本术语:板条箱和模块”,它解释了两者之间的区别(我个人下面的示例过于冗长)。
澳洲航空94重型

Answers:


87

extern crate foo 表示您要链接到外部库,并将顶级条板箱名称带入范围(相当于 use foo)。从Rust 2018开始,在大多数情况下,您不再需要使用它extern crate因为Cargo会通知编译器存在哪些包装箱。(有一两个例外

use bar 是引用标准符号的简写。

从理论上讲,不需要 该语言use-您始终可以只对名称进行完全限定,但是键入std::collections::HashMap.new(...)将变得非常乏味!取而代之的是,您只需键入use std::collections::HashMap一次,然后即可HashMap进行引用。


3
没有use,我们甚至不能拥有std它的外观。要么我们就会有一个单一的整体标准库箱,或者每个人都将被处理的事实,String实际上是collections::string::String

45

在撰写本文时,已接受的答案是正确的。但是,它不再正确。 extern crate自Rust 2018以来几乎不需要。

现在,您只需要向Cargo.toml添加外部依赖项即可。

use 与以前一样。

官方文档中了解更多信息

编辑:现在已经编辑了可接受的答案以正确反映Rust 2018中的更改。


即使没有必要,将外部包装箱与标准包装箱分开也没有好处吗?喜欢extern crate failure;use std::error::Error
Paul Razvan Berg

2
@PaulRazvanBerg您的意思是要澄清哪些导入来自标准库,哪些是外部导入?至少我不这样,我也不建议这么做。但是我认为您应该以自己认为最有意义的方式来构造代码。
dropbear
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.