Chcem implementovať vlastnú vlastnosť &"a str
a pre celé čísla do i32
, ale Rust mi neumožňuje:
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() {}
Toto zlyhá pri kompilácii s nasledujúcou chybou:
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
neimplementuje Into<i32>
, Je možné realizovať UiId
pre &"a str
a všetko, na čo sa dá premeniť i32
bez určenia konkrétnych typov? Ako to môžem spraviť?
odpovede:
10 pre odpoveď č. 1Skutočnosť, že &"a str
neimplementuje Into<i32>
nie je braný do úvahy, pretože neexistuje žiadna záruka, že by nemohol byť pridaný neskôr.
Ak by to umožnilo, prípadné poškodenie by sťažilo pridanie implementácií do vlastností knižnice.
Bohužiaľ som nemohol nájsť dokumentáciu pre to, ani v Jazyk programovania ruby Kniha ani v Referenčná príručka.
Najlepšie, čo som mohol nájsť, je RFC 1023, ktorá to hovorí prepravka [...] sa na to nemôže spoľahnúť Type: !Trait
platí, ak Type
alebo Trait
je lokálny.