#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
использование перед реальной ошибкой?