У меня есть ящик с типом, живущим внутри модуля.Для внутренних целей я хочу реализовать 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)
, я получу эту ошибку ( Детская площадка ):
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
Я не понимаю этого: Я думал, что ошибка "закрытого типа в публичном интерфейсе" была только для интерфейса crate-public.Та же ошибка возникает при перемещении Key
в другой модуль.
Почему блок impl
внезапно считается открытым интерфейсом, если сделать Key
pub(crate)
?Как именно определяется видимость блока impl
?