2015-01-09 9 views
14

Vom Rust Reiseführer:Warum wird beim Drucken eines Zeigers das gleiche wie beim Drucken des dereferenzierten Zeigers ausgegeben?

zu dereferenzieren (der Wert bezeichnet erhalten wird, der Verweis auf anstatt selbst) y wir das Sternchen (*)

So benutze ich es tat:

fn main() { 
    let x = 1; 
    let ptr_y = &x; 
    println!("x: {}, ptr_y: {}", x, *ptr_y); 
} 

Das gibt mir die gleichen Ergebnisse (x = 1; y = 1) auch ohne eine explizite Dereferenzierung:

fn main() { 
    let x = 1; 
    let ptr_y = &x; 
    println!("x: {}, ptr_y: {}", x, ptr_y); 
} 

Warum? Sollte nicht ptr_y die Speicheradresse und *ptr_y drucken 1 drucken? Gibt es eine Art Auto-Dereferenzierung oder habe ich etwas übersehen?

Antwort

17

Normalerweise konzentriert sich Rust eher auf den Objektwert (d. H. Den interessanten Teil des Inhalts) als auf die Objektidentität (Speicheradressen). Die implementation of Display für &T, wobei T implementiert Display direkt auf den Inhalt verweist. Die Erweiterung dieses Makro manuell für die String Implementierung von Display:

impl<'a> Display for &'a String { 
    fn fmt(&self, f: &mut Formatter) -> Result { 
     Display::fmt(&**self, f) 
    } 
} 

Das heißt, es druckt nur direkt seinen Inhalt.

Wenn Sie über Objektidentität/die Speicheradresse kümmern, können Sie mit den Pointer formatter, {:p}:

fn main() { 
    let x = 1; 
    let ptr_y = &x; 
    println!("x: {}, ptr_y: {}, address: {:p}", x, ptr_y, ptr_y); 
} 

Ausgang:

x: 1, ptr_y: 1, address: 0x7fff4eda6a24 

playground

+2

ich am Rust Handbuch über Zeiger ein wenig nach Ihrem Posting und sie benutzen einfach "{: p}, ptr_y" weil "println! wird es automatisch für uns dereferenzieren". Eine kurze Frage: Ich verwende normalerweise etwas wie "Typ Name = Wert" oder "Int Test = 1". Es scheint, dass ich das nicht in Rust als Option haben kann, "let int test = 1" gibt Compiler Fehler? Ich weiß, dass der Compiler den Typ automatisch bekommt, aber um meiner Syntax willen möchte ich sie in meinen Code schreiben :(. Wie auch immer, danke für deine Antwort, auch wenn ich keine Ahnung habe, was das Makro genau macht:). – Vega

+3

Oh, ja, '{: p}' funktioniert auch, der 'p' [Formatspezifizierer] (http://doc.rust-lang.org/nightly/std/fmt/#formatting-traits) ist [implementiert für verschiedene Arten von Zeigern] (http://doc.rust-lang.org/nightly/std/fmt/trait.Pointer.html), um nur die Adresse zu drucken. – huon

+2

[Typen werden angegeben als 'let x: Type = 1; '] (http://doc.rust-lang.org/nightly/guide.html#variable-bindings). – huon

Verwandte Themen