Частная черта и E0119?

#rust

#Ржавчина

Вопрос:

Есть ли у Rust такая вещь, как «частная черта»? Я имею в виду, что черта, определенная без pub ключевого слова, является частной?

Приведенный ниже код выдает ошибку компиляции:

 error[E0119]: conflicting implementations of trait `MyFrom<i64>` for type `std::option::Option<amp;_>`:
  --> src/main.rs:22:1
   |
16 | impl<T: Foo> MyFrom<i64> for Option<T> {
   | -------------------------------------- first implementation here
...
22 | impl<T: Foo> MyFrom<i64> for Option<amp;T> {
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `std::option::Option<amp;_>`
   |
   = note: downstream crates may implement trait `Foo` for type `amp;_`
  

Но это не общедоступная черта, и это exe , как «нижестоящие ящики могут реализовать черту Foo для типа amp;_ «? Невозможно импортировать признак из exe crate, и даже если это возможно, это не pub признак,
так rustc не поддерживает частные черты?

 fn main() {
    trait MyFrom<T> {
        fn my_from(_: T) -> Self;
    }

    trait Foo {}

    impl<T: Foo> MyFrom<i64> for Option<T> {
        fn my_from(x: i64) -> Self {
            unimplemented!();
        }
    }

    impl<T: Foo> MyFrom<i64> for Option<amp;T> {
        fn my_from(x: i64) -> Self {
            unimplemented!();
        }
    }
}

  

Комментарии:

1. Примечание о создании по потоку не является ошибкой. Ошибка в том, что у вас есть общая реализация для всех Option<T> , где T может быть ссылочным типом. Если был тип, T такой, что T: Foo и amp;T: Foo тогда нет способа решить, для какой функции использовать Option<amp;T>::my_from .

2. @turbulencetoo Я понимаю это, но, как вы видите, в моем ящике нет такой вещи: введите X это X: Foo amp;X: Foo , и из-за trait Foo невозможности использования вне ящика непонятно, почему компилятор выдает ошибку.

3.Вот еще более простой пример, который очень похож на ваш:play.rust-lang.org/… Это конфликт, потому что T мог реализовать оба Foo и Bar . То, что в настоящее время такого типа нет, не означает, что это не footgun.

4. @turbulencetoo Но этот компилятор может проверить весь ящик, и он обнаружил такую проблему, а затем выдает ошибку, почему он выдает ошибку, прежде чем я сделаю что-то не так, в моем коде нет ошибки, это может быть в будущем, но когда она появится, она должна выдать ошибку.

5. @turbulencetoo Если trait будет общедоступным, то ошибка понятна, невозможно контролировать все ящики, которые используют мой ящик, но trait частный, так зачем жаловаться на trait использование перед реальной ошибкой?