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.