/ / Суперечливі реалізації ознаки в Русті - дженерики, іржа, реалізація, риси

Конфліктні реалізації особливості в іржі - генерики, іржа, реалізація, риси

Я хочу реалізувати власну властивість для &"a str і для цілих чисел до i32, але іржа не дозволяє мені:

use std::convert::Into;

pub trait UiId {
fn push(&self);
}

impl<"a> UiId for &"a str {
fn push(&self) {}
}

impl<T: Into<i32>> UiId for T {
fn push(&self) {}
}

fn main() {}

Це не може скомпілюватися з такою помилкою:

error[E0119]: conflicting implementations of trait `UiId` for type `&str`:
--> src/main.rs:11:1
|
7  | impl<"a> UiId for &"a str {
| ------------------------- first implementation here
...
11 | impl<T: Into<i32>> UiId for T {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `&str`
|
= note: upstream crates may add new impl of trait `std::convert::From<&str>` for type `i32` in future versions

&"a str не реалізується Into<i32>. Чи можна реалізувати UiId за &"a str і все, що можна перетворити i32 без вказівки конкретних типів? Як я можу це зробити?

Відповіді:

10 за відповідь № 1

Справа в тому, що &"a str не реалізується Into<i32> не береться до уваги, тому що немає гарантії, що він не може бути доданий пізніше.

Таким чином, якщо б це було дозволено, можливий поломка ускладнив би додавання реалізацій до бібліотечних рис.

На жаль, я не міг знайти документацію для цього, ні в Мова програмування іржі Книга ні в Довідковий посібник.

Найкраще, що я міг знайти RFC 1023, що говорить про це ящик [...] не може покладатися на це Type: !Trait тримається хіба що Type або Trait є місцевим.