/ Konfliktné implementácie vlastností v Rust - generiká, hrdza, implementácia, vlastnosti

Konfliktné implementácie znaku v Rust - generika, hrdza, implementácia, vlastnosti

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ď č. 1

Skutoč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.