Soy nuevo en Rust. Creo que usese usa para importar identificadores al alcance actual y externse usa para declarar un módulo externo. Pero esta comprensión (tal vez incorrecta) no tiene ningún sentido para mí. ¿Alguien puede explicar por qué Rust tiene estos dos conceptos y cuáles son los casos adecuados para usarlos?
81

extern crate foo;? Las cajas y los módulos son conceptos separados en Rust, es posible que desee echar un vistazo a "Terminología básica: cajas y módulos" que explica la diferencia entre los dos (aunque personalmente encuentro los ejemplos a continuación demasiado detallados).Respuestas:
extern crate fooindica que desea vincular con una biblioteca externa y trae el nombre de la caja de nivel superior al alcance (equivalente ause foo). A partir de Rust 2018, en la mayoría de los casos no necesitará usarextern cratemás porque Cargo informa al compilador sobre qué cajas están presentes. (Hay una o dos excepciones )use bares una forma abreviada de hacer referencia a símbolos completos.Teóricamente, el idioma no es necesario
use: siempre puedes calificar completamente los nombres, ¡pero escribirstd::collections::HashMap.new(...)sería muy tedioso! En su lugar, solo puede escribiruse std::collections::HashMapuna vez y luegoHashMapse referirá a eso.fuente
use, ni siquiera podríamos tenerstdla fachada que es. O tendríamos una única caja de biblioteca estándar monolítica, o todos estarían lidiando con el hecho de que enStringrealidad lo escollections::string::String.La respuesta aceptada era correcta al momento de escribir este artículo. Sin embargo, ya no es correcto.
extern cratecasi nunca se necesita desde Rust 2018.Ahora solo debe agregar dependencias externas a su Cargo.toml.
usefunciona igual que antes.Leer más en la documentación oficial .
Editar: la respuesta aceptada ahora se ha editado para reflejar correctamente los cambios en Rust 2018.
fuente
extern crate failure;perouse std::error::Error