¿Cuál es la diferencia entre uso y externo?

81

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?

maralla
fuente
5
¿Te refieres a la declaración 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).
Qantas 94 Heavy

Respuestas:

87

extern crate fooindica que desea vincular con una biblioteca externa y trae el nombre de la caja de nivel superior al alcance (equivalente a use foo). A partir de Rust 2018, en la mayoría de los casos no necesitará usar extern cratemás porque Cargo informa al compilador sobre qué cajas están presentes. (Hay una o dos excepciones )

use bar es 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 escribir std::collections::HashMap.new(...)sería muy tedioso! En su lugar, solo puede escribir use std::collections::HashMapuna vez y luego HashMapse referirá a eso.

Pastor
fuente
3
Sin use, ni siquiera podríamos tener stdla 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 en Stringrealidad lo es collections::string::String.
46

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.

use funciona 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.

dropbear
fuente
Incluso si no es necesario, ¿no hay un beneficio en separar las cajas externas de las estándar? Me gusta extern crate failure;perouse std::error::Error
Paul Razvan Berg
2
@PaulRazvanBerg ¿Te refieres solo a aclarar qué importaciones son de la biblioteca estándar y cuáles son importaciones externas? No para mí al menos, y tampoco creo que sea recomendable. Pero creo que debería estructurar su código de la manera que crea que tiene más sentido para usted.
dropbear