Jestem nowy w Rust. Myślę, że use
służy do importowania identyfikatorów do bieżącego zakresu i extern
sł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?
91
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).Odpowiedzi:
extern crate foo
wskazuje, że chcesz połączyć się z biblioteką zewnętrzną i wprowadza nazwę skrzynki najwyższego poziomu do zakresu (odpowiednikuse foo
). Jak Rust 2018, w większości przypadków nie trzeba używaćextern crate
już 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 pisaniestd::collections::HashMap.new(...)
byłoby bardzo nudne! Zamiast tego możesz wpisaćuse std::collections::HashMap
jeden raz, a następnieHashMap
odnieść się do tego.źródło
use
nie moglibyśmy nawet miećstd
takiej fasady. Albo mielibyśmy pojedynczą monolityczną skrzynkę biblioteki standardowej, albo wszyscy mieliby do czynienia z faktem, żeString
tak jestcollections::string::String
.Przyjęta odpowiedź była prawidłowa w momencie pisania. Jednak to już nie jest poprawne.
extern crate
prawie 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.
źródło
extern crate failure;
tylkouse std::error::Error