use와 extern의 차이점은 무엇입니까?


91

저는 Rust를 처음 사용합니다. 나는 그 생각 use현재 범위에 수입 식별자로 사용되며 extern외부 모듈을 선언하는 데 사용됩니다. 그러나이 이해 (아마도 틀렸을 수도 있음)는 나에게 의미가 없습니다. 누군가 Rust에이 두 가지 개념이있는 이유와이를 사용하기에 적합한 경우가 무엇인지 설명 할 수 있습니까?


6
그 진술을 말씀 extern crate foo;하시는 건가요? 상자와 모듈은 Rust에서 별개의 개념입니다 . 두 가지의 차이점을 설명하는 "기본 용어 : 상자와 모듈" 을 살펴보고 싶을 것 입니다.
Qantas 94 Heavy

답변:


91

extern crate foo외부 라이브러리에 링크하려고 함을 나타내며 최상위 수준 상자 이름을 범위로 가져옵니다 (와 동일 use foo). Rust 2018 부터는extern crate Cargo가 컴파일러에게 어떤 상자가 있는지 알려주기 때문에 대부분의 경우 더 이상 사용할 필요가 없습니다 . ( 한두 가지 예외가 있습니다. )

use bar 정규화 된 기호를 참조하는 약어입니다.

이론적으로는 언어가 필요 하지 않습니다. use항상 이름을 완전히 정규화 할 수 있지만 타이핑 std::collections::HashMap.new(...)은 매우 지루할 것입니다! 대신 use std::collections::HashMap한 번만 입력 하면 HashMap해당 내용을 참조 할 수 있습니다.


3
없이는 외관을 그대로 use가질 수 없습니다 std. 하나의 모 놀리 식 표준 라이브러리 상자가 있거나 모든 사람들 String이 실제로 collections::string::String.

52

수락 된 답변은 작성 당시에 정확했습니다. 그러나 더 이상 정확하지 않습니다. extern crateRust 2018 이후로 거의 필요하지 않습니다.

이제 Cargo.toml에 외부 종속성을 추가하기 만하면됩니다.

use 이전과 동일하게 작동합니다.

공식 문서 에서 자세한 내용을 읽어보십시오 .

편집 : 이제 수락 된 답변이 Rust 2018의 변경 사항을 올바르게 반영하도록 편집되었습니다.


필요하지 않더라도 일반 상자에서 외부 상자를 분리하면 이점이 없습니까? 마찬가지로 extern crate failure;하지만use std::error::Error
폴 Razvan 보낸 버그

2
@PaulRazvanBerg 표준 라이브러리에서 가져온 가져 오기와 외부 가져 오기를 명확히하기위한 것입니까? 적어도 나에게는 그다지 추천하지 않습니다. 하지만 가장 이해하기 쉬운 방식으로 코드를 구성해야한다고 생각합니다.
dropbear
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.