我有一个板条箱,其类型位于模块内部。出于内部目的,我想使用两种私有索引和值类型为该类型实现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
块的可见性?