Что именно представляет собой видимость блока impl, полученного из используемых в нем типов? - PullRequest
2 голосов
/ 15 мая 2019

У меня есть ящик с типом, живущим внутри модуля.Для внутренних целей я хочу реализовать 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...