Jaka jest różnica między use i extern?

91

Jestem nowy w Rust. Myślę, że usesłuży do importowania identyfikatorów do bieżącego zakresu i externsłuży do deklarowania modułu zewnętrznego. Ale to zrozumienie (może błędne) nie ma dla mnie żadnego sensu. Czy ktoś może wyjaśnić, dlaczego Rust ma te dwie koncepcje i jakie są odpowiednie przypadki ich użycia?

maralla
źródło
6
Czy odnosisz się do oświadczenia extern crate foo;? Skrzynki i moduły to osobne koncepcje w Rusta, warto rzucić okiem na „Podstawową terminologię: skrzynki i moduły”, która wyjaśnia różnicę między nimi (osobiście uważam poniższe przykłady za zbyt szczegółowe).
Qantas 94 Heavy

Odpowiedzi:

91

extern crate foowskazuje, że chcesz połączyć się z biblioteką zewnętrzną i wprowadza nazwę skrzynki najwyższego poziomu do zakresu (odpowiednik use foo). Jak Rust 2018, w większości przypadków nie trzeba używać extern cratejuż ponieważ Cargo informuje kompilator o tym, co skrzynie są obecne. (Jest jeden lub dwa wyjątki )

use bar to skrót odnoszący się do w pełni kwalifikowanych symboli.

Teoretycznie język nie potrzebuje use - zawsze możesz po prostu w pełni zakwalifikować nazwy, ale pisanie std::collections::HashMap.new(...)byłoby bardzo nudne! Zamiast tego możesz wpisać use std::collections::HashMapjeden raz, a następnie HashMapodnieść się do tego.

Shepmaster
źródło
3
Bez niej usenie moglibyśmy nawet mieć stdtakiej fasady. Albo mielibyśmy pojedynczą monolityczną skrzynkę biblioteki standardowej, albo wszyscy mieliby do czynienia z faktem, że Stringtak jest collections::string::String.
52

Przyjęta odpowiedź była prawidłowa w momencie pisania. Jednak to już nie jest poprawne. extern crateprawie nigdy nie jest potrzebny od Rust 2018.

Teraz wystarczy dodać zewnętrzne zależności do Cargo.toml.

use działa tak samo jak poprzednio.

Przeczytaj więcej w oficjalnej dokumentacji .

Edycja: zaakceptowana odpowiedź została zmieniona, aby poprawnie odzwierciedlić zmiany w Rust 2018.

dropbear
źródło
Nawet jeśli nie jest to konieczne, czy nie ma korzyści z oddzielania skrzynek zewnętrznych od standardowych? Jak extern crate failure;tylkouse std::error::Error
Paul Razvan Berg
2
@PaulRazvanBerg Masz na myśli tylko wyjaśnienie, które pliki importowane pochodzą z biblioteki standardowej, a które z importu zewnętrznego? Przynajmniej nie mnie i nie sądzę, żeby to było zalecane. Ale myślę, że powinieneś ustrukturyzować swój kod w sposób, który wydaje Ci się najbardziej sensowny.
dropbear