use和extern有什么区别?

mar*_*lla 32 rust

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

She*_*ter 31

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

use bar 是引用完全限定符号的简写.

从理论上讲,语言并不需要 use - 你可以随时完全限定名称,但打字std::collections::HashMap.new(...)会变得非常繁琐!相反,您只需键入use std::collections::HashMap一次然后HashMap将引用它.(extern crate foo声明use foo是前奏的一部分,所以你通常不会看到)

  • 没有 `use`,我们甚至不能拥有 `std` 作为它的外观。要么我们有一个单一的标准库包,要么每个人都会处理这样一个事实,即 `String` 实际上是 `collections::string::String`。 (5认同)

dro*_*ear 14

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

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

use 与以前一样。

官方文档中阅读更多内容

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

  • 即使没有必要,将外部板条箱与标准板条箱分开不是有好处吗?就像 `extern crate failure;` 但 `use std::error::Error` (2认同)
  • @PaulRazvanBerg您的意思只是为了澄清哪些导入来自标准库,哪些是外部导入?至少对我来说不是,而且我也不建议这样做。但我认为你应该按照你认为对你来说最有意义的方式构建你的代码。 (2认同)