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 № 1Die 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.