Я хочу реалізувати власну властивість для &"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
є місцевим.