'pub'는 공개-크레이트 또는 공개-모듈을 의미합니까? [복제]
하위 모듈의 메소드를 공개하려면 명시 적으로 다시 내보내거나 하위 모듈 자체를 공개해야합니다.
mod foo {
mod bar {
pub fn baz() {}
}
pub use self::bar::baz;
}
이것은 pub
무언가가 모듈에만 공개되어야 함을 나타내는 데 사용되는 힌트처럼 보입니다 (이렇게 하지 않도록 선택할 수 있기 때문에)
당신이 외부 상황에 정의 된 개인 유형을 사용하는 경우 시도하고 그것이에도 내부 맥락에서 대중을 포함하는 공공 기능을 할 경우, 당신은 오류가 발생 하지 재수출을.
mod foo {
struct Foo;
mod bar {
use super::Foo;
pub fn baz(foo: Foo) {}
}
}
결과
error[E0446]: private type `Foo` in public interface
--> src/lib.rs:7:9
|
2 | struct Foo;
| - `Foo` declared as private
...
7 | pub fn baz(foo: Foo) {}
| ^^^^^^^^^^^^^^^^^^^^ can't leak private type
pub
키워드 를 사용하는 관용적 인 방법은 무엇입니까 ? 실제로 공개 된 것을 위해 예약해야합니까, 아니면 내부 모듈에 사용할 수 있습니까?
답변
귀하의 예제가 컴파일에 실패한 이유는 궁극적으로 RFC (136) 가 그렇게 말했기 때문입니다. ( 문제 22261 참조 )
공공 항목에는 어떤 제한이 적용됩니까?
다양한 종류의 공개 항목에 대한 규칙은 다음과 같습니다.
static
선언 인 경우 해당 유형에서 참조되는 항목은 공용이어야합니다.fn
선언 인 경우 특성 경계, 인수 유형 및 반환 유형에서 참조되는 항목은 공용이어야합니다.struct
또는enum
선언 인 경우 특성 범위 및pub
필드 유형에서 참조되는 항목 은 공용이어야합니다.type
선언 인 경우 정의에 언급 된 항목은 공개되어야합니다.trait
선언 인 경우 상위 특성, 유형 매개 변수의 특성 경계 및 해당 메서드의 서명 (fn
위의 경우 참조)에서 참조되는 항목은 공용이어야합니다.
요컨대, 개인 유형 인 인수가 있기 때문에 baz
허용되지 않습니다 pub
. 따라서, 경우 baz
이다 pub
는 부모 있도록 할 mod foo
재수출을 baz
수행하여 pub use bar::baz;
. 이것은 물론 허용되지 않으며, 이것이 전체 예가 불법 인 이유입니다.
일부는 이전에 pub fn baz
허용되어야한다고 언급 했으며 대신 상위 모듈이이를 다시 내보낼 경우 컴파일 오류를 제공합니다. 그러나이를 탐지하려면 더 복잡한 정적 분석이 필요하며 RFC가 불법이라고 정의했기 때문에 궁극적으로 수행되지 않았습니다.
pub
상위 모듈이 항목에 액세스 할 수 있도록 지정합니다. 모든 모듈 조상이 pub
인 경우 해당 항목은 상자에서 전체로 내보내집니다.
키워드
pub
는 외부 모듈 내부에서 모든 모듈, 함수 또는 데이터 구조에 액세스 할 수 있도록합니다. 이pub
키워드는use
선언에서 네임 스페이스에서 식별자를 다시 내보내는 데 사용할 수도 있습니다 .– Rust 문서
항목이 공개 또는 비공개라는 개념으로 Rust는 두 가지 경우에 항목 액세스를 허용합니다.
- 항목이 공개 인 경우 m에서 항목의 모든 조상 모듈에 액세스 할 수 있으면 일부 모듈 m에서 외부 적으로 액세스 할 수 있습니다. 다시 내보내기를 통해 항목의 이름을 지정할 수도 있습니다. 아래를 참조하십시오.
- 항목이 비공개 인 경우 현재 모듈과 해당 하위 항목에서 액세스 할 수 있습니다.
– Rust 참조-가시성과 프라이버시