'pub'는 공개-크레이트 또는 공개-모듈을 의미합니까? [복제]

Dec 15 2020

하위 모듈의 메소드를 공개하려면 명시 적으로 다시 내보내거나 하위 모듈 자체를 공개해야합니다.

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키워드 를 사용하는 관용적 인 방법은 무엇입니까 ? 실제로 공개 된 것을 위해 예약해야합니까, 아니면 내부 모듈에 사용할 수 있습니까?

답변

2 vallentin Dec 15 2020 at 04:06

귀하의 예제가 컴파일에 실패한 이유는 궁극적으로 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는 두 가지 경우에 항목 액세스를 허용합니다.

  1. 항목이 공개 인 경우 m에서 항목의 모든 조상 모듈에 액세스 할 수 있으면 일부 모듈 m에서 외부 적으로 액세스 할 수 있습니다. 다시 내보내기를 통해 항목의 이름을 지정할 수도 있습니다. 아래를 참조하십시오.
  2. 항목이 비공개 인 경우 현재 모듈과 해당 하위 항목에서 액세스 할 수 있습니다.

– Rust 참조-가시성과 프라이버시