Vor einiger Zeit habe ich einen generischen Iterator für die Fibonacci-Sequenz geschrieben, der sowohl primitive Zahlen als auch benutzerdefinierte Typen akzeptieren könnte (wie bignums
). Nachdem es nicht gelungen, eine Version zum Laufen zu bringen für beide primitiven Typen und bignums
, ich auf dieser Frage gestolpert:Rust generic AddAssign mit Referenzen
How to write a trait bound for adding two references of a generic type?
die so genannten gebrauchten höherrangigen Trait Bounds das Problem mit diesem besonderen Problem zu lösen .
Jetzt versuche ich jedoch, eine ähnliche Strategie zu verwenden, anstatt die Operatoren zu verwenden. Insbesondere, ich versuche, etwas ähnliches zu dieser Funktion zu erhalten:
use std::ops::{Add, AddAssign};
fn add_test<'a, T>(x: &'a T, y: &'a T) -> T
where
for<'b> &'b T: Add<Output = T>,
{
x + y
}
fn add_assign_test<'a, T>(x: &'a mut T, y: &'a T) -> T
where
for<'b> &'b mut T: AddAssign<&'b T>,
T: Clone,
{
x += y;
x.clone()
}
fn main() {
println!("add_test()={}", add_test(&1, &2));
println!("add_assign_test()={}", add_assign_test(&mut 2, &2));
}
add_test()
funktioniert wie erwartet, aber ich bin nicht in der Lage add_assign_test()
zu erhalten in ähnlicher Art und Weise zu arbeiten. Die Fehler erhalte ich vorschlagen, dass es vielleicht nicht wirklich eine Implementierung für diese Art von Verhalten auf den primitiven Typen existieren:
error[E0277]: the trait bound `for<'b> &'b mut _: std::ops::AddAssign<&'b _>` is not satisfied
--> src/main.rs:21:38
|
21 | println!("add_assign_test()={}", add_assign_test(&mut 2, &2));
| ^^^^^^^^^^^^^^^ no implementation for `&'b mut _ += &'b _`
|
= help: the trait `for<'b> std::ops::AddAssign<&'b _>` is not implemented for `&'b mut _`
= note: required by `add_assign_test`
ich ein Makro erstellen können, die Implementierungen für diese Operatoren erzeugt, die Verweise auf die primitive tatsächlich nimmt Arten, aber das scheint ein wenig verschwenderisch. Gibt es eine andere Möglichkeit, denselben Effekt zu erzielen?
Hmm, das war ziemlich viel, was ich nicht wollte :( Mit Blick auf den Rost Repo-Karten hören, ich denke, das ist das gleiche Problem wie: https://github.com/rust- lang/rost/issues/32094 right? – Xaldew
@Xaldew Ja, das scheint das Problem zu sein ... Das ist ein bisschen enttäuschend, in der Tat ... –
Blick auf die https://blog.rust-lang.org/2017/11/ 22/Rust-1.22.html ändert sich, es sieht so aus, als ob das jetzt tatsächlich behoben wurde.Nur eine Kleinigkeit, die mir aufgefallen ist, als ich das noch einmal gelesen habe: Warum muss ich die linke Seite dereferenzieren? – Xaldew