Trotz der Dokumentation gründlich zu lesen, bin ich ziemlich verwirrt über die Bedeutung des &
und *
Symbol in Rust, und ganz allgemein über das, was ist ein Rust Referenz genau.Bedeutung der Et-Zeichen ‚&‘ und Stern ‚*‘ Symbole in Rust
In diesem Beispiel scheint es, ähnlich wie bei einer C++ Referenz zu sein (das heißt, eine Adresse, die automatisch dereferenziert wird, wenn verwendet):
fn main() {
let c: i32 = 5;
let rc = &c;
let next = rc + 1;
println!("{}", next); // 6
}
jedoch der folgende Code funktioniert genau gleich:
Mit *
zur Dereferenzierung wäre eine Referenz in C++ nicht korrekt. Also würde ich gerne verstehen, warum das in Rust stimmt.
Mein Verständnis so weit ist, dass das Einfügen *
vor einem Dereferenzierungen Rust Referenz, aber die *
implizit sowieso eingefügt, so dass Sie es nicht hinzufügen müssen (während in C++, es implizit eingefügt wird und wenn Sie fügen Sie es ein, Sie erhalten einen Kompilierungsfehler).
jedoch so etwas wie dies lässt sich nicht kompilieren:
fn main() {
let mut c: i32 = 5;
let mut next: i32 = 0;
{
let rc = &mut c;
next = rc + 1;
}
println!("{}", next);
}
<anon>:6:16: 6:18 error: binary operation `+` cannot be applied to type `&mut i32` [E0369]
<anon>:6 next = rc + 1;
^~
<anon>:6:16: 6:18 help: see the detailed explanation for E0369
<anon>:6:16: 6:18 note: an implementation of `std::ops::Add` might be missing for `&mut i32`
<anon>:6 next = rc + 1;
Aber das funktioniert:
fn main() {
let mut c: i32 = 5;
let mut next: i32 = 0;
{
let rc = &mut c;
next = *rc + 1;
}
println!("{}", next); // 6
}
Es scheint, dass implizite dereferenzierenden (a la C++) für unveränderliche Referenzen korrekt ist , aber nicht für veränderbare Referenzen. Warum ist das?
Danke, ich verstehe jetzt. Eigentlich hatte ich gedacht, es könnte so etwas sein, aber ich hatte den Gedanken verworfen, weil ich dachte, es wäre sehr seltsam, die Summe einer Ganzzahl mit einer solchen Ganzzahl zu definieren. Vielleicht sollte in dem Dokument betont werden, dass Rust-Referenzen als Adressen gedacht sind und nicht mit C++ - Referenzen zu verwechseln sind. Nochmals vielen Dank für die ausführliche Erklärung. –