/ / Widersprüchliche Implementierungen von Merkmalen in Rust - Generika, Rost, Implementierung, Merkmale

Widersprüchliche Implementierungen von Merkmalen in Rust - Generika, Rost, Implementierung, Merkmale

Ich möchte eine benutzerdefinierte Eigenschaft für implementieren &"a str und für ganze Zahlen bis i32, aber Rust erlaubt mir nicht:

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() {}

Dies kann mit folgendem Fehler nicht kompiliert werden:

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 implementiert nicht Into<i32>. Ist es möglich zu implementieren? UiId zum &"a str und alles, was in umgewandelt werden kann i32 ohne konkrete Typen anzugeben? Wie kann ich das machen?

Antworten:

10 für die Antwort № 1

Die Tatsache, dass &"a str implementiert nicht Into<i32> wird nicht berücksichtigt, da es keine Garantie dafür gibt, dass es später nicht hinzugefügt werden kann.

Wenn dies erlaubt wäre, würde der mögliche Bruch das Hinzufügen von Implementierungen zu Bibliotheksmerkmalen schwieriger machen.

Leider konnte ich dafür keine Dokumentation finden, auch nicht in Die Rost Programmiersprache Buchen Sie noch im Referenzhandbuch.

Das Beste, was ich finden konnte, ist RFC 1023was das sagt eine kiste kann sich nicht darauf verlassen Type: !Trait gilt solange nicht Type oder Trait ist lokal.