从其中使用的类型派生的impl块的可见性到底是什么?

时间:2019-05-15 14:27:26

标签: rust

我有一个板条箱,其类型位于模块内部。出于内部目的,我想使用两种私有索引和值类型为该类型实现ops::Index

pub mod inner {
    pub struct Data;

    struct Value;
    struct Key;

    impl std::ops::Index<Key> for Data {
        type Output = Value;
        fn index(&self, index: Key) -> &Self::Output {
            unimplemented!()
        }
    }
}

这有效。到目前为止,一切都很好。

但是如果我将Key的可见性更改为pub(crate),则会出现此错误(Playground):

error[E0446]: private type `inner::Value` in public interface
 --> src/lib.rs:9:9
  |
4 |     struct Value;
  |     - `inner::Value` declared as private
...
9 |         type Output = Value;
  |         ^^^^^^^^^^^^^^^^^^^^ can't leak private type

我不明白这一点:我认为“公共接口中的私有类型”错误仅适用于板条箱-公共接口。将Key移动到另一个模块时,会发生相同的错误。

为什么将impl Key设为pub(crate)块突然将其视为公共接口?如何确定impl块的可见性?

0 个答案:

没有答案