useとexternの違いは何ですか?


91

Rustは初めてです。これは、use識別子を現在のスコープにインポートexternするために使用され、外部モジュールを宣言するために使用されると思います。しかし、この理解(おそらく間違っている)は私には意味がありません。Rustがこれらの2つの概念を持っている理由と、それらを使用するのに適したケースは何かを誰かが説明できますか?


6
あなたは声明を参照していextern crate foo;ますか?クレートとモジュールはRustの別個の概念です。この2つの違いを説明する「基本的な用語:クレートとモジュール」を参照してください(個人的には、以下の例は非常に冗長です)。
カンタス94ヘビー

回答:


91

extern crate foo外部ライブラリに対してリンクすることを示し、最上位のクレート名をスコープに入れます(と同等use foo)。Rust 2018の時点では、Cargoがコンパイラにどのクレートが存在するかを通知するため、ほとんどの場合、使用する必要はありextern crateません。(1つまたは2つの例外があります

use bar 完全修飾記号を参照するための省略形です。

理論的には、言語は必要あり ません。use名前を完全修飾することはいつでも可能ですが、入力std::collections::HashMap.new(...)は非常に面倒になります。代わりに、use std::collections::HashMap一度入力するだけで、それHashMapを参照できます。


3
がなければusestdファサードのようにすることすらできませんでした。モノリシックな標準ライブラリクレートが1つあるか、実際にStringは誰もがその事実に対処しているでしょうcollections::string::String

52

受け入れられた答えは、執筆時点で正しかった。しかし、それはもはや正しくありません。 extern crateRust 2018以降、ほとんど必要ありません。

これで、Cargo.tomlに外部依存関係を追加するだけで済みます。

use 以前と同じように機能します。

詳細については、公式ドキュメントをご覧ください。

編集:承認された回答は、Rust2018での変更を正しく反映するように編集されました。


必要がない場合でも、外部の木枠を標準の木枠から分離することには利点がありませんか?同様extern crate failure;けどuse std::error::Error
ポールはRazvanバーグ

2
@PaulRazvanBerg標準ライブラリからのインポートと、外部インポートのインポートを明確にするだけですか?少なくとも私にはそうではなく、それもお勧めできないと思います。しかし、私はあなたがあなたにとって最も理にかなっていると感じる方法であなたのコードを構造化するべきだと思います。
にdropbear
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.