2015-01-09 19 views
14

z prowadnicy Rust:Dlaczego drukowanie wskaźnika drukuje to samo, co drukowanie wskaźnika dereferencji?

Aby dereference (uzyskać wartość określa się tutaj zamiast samego odniesienia) y używamy gwiazdkę (*)

Więc zrobiłem to:

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

To daje takie same wyniki (x = 1, y = 1), nawet bez wyraźnego dereference:

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

Dlaczego? Czy nie powinien być wydrukowany adres pamięci ptr_y i *ptr_y wydrukować 1? Czy jest jakiś rodzaj auto-dereferencji, czy też coś przeoczyłem?

Odpowiedz

17

Rdza zwykle skupia się na wartości przedmiotu (tj. Na interesującej części treści), a nie na tożsamości obiektu (adresy pamięci). Obiekt implementation of Display dlaimplementuje odtworza się bezpośrednio do zawartości. ręcznie rozszerza tego makra dla realizacji String z Display:

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

to znaczy, że jest po prostu drukowania bezpośrednio do jego zawartości.

Jeśli dbasz o obiekcie tożsamość/adres pamięci, można użyć Pointer formatter, {:p}:

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

wyjściowa:

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

playground

+2

czytam w przewodniku Rust temat Wskaźniki nieco po twoim wpisie i po prostu używają "{: p}, ptr_y", ponieważ "println! automatycznie je usunie dla nas". Krótkie pytanie: Zwykle używam czegoś takiego jak "Type name = value" lub "int test = 1". Wydaje się, że nie mogę tego w Rust jako opcji, "niech int test = 1" daje błąd kompilatora? Wiem, że kompilator dostaje typ automatycznie, ale ze względu na moją składnię chciałbym zapisać go w moim kodzie, gdy zadeklaruję :( W każdym razie, dziękuję za odpowiedź, nawet gdy nie mam pojęcia, co dokładnie robi makro:). – Vega

+3

Och, tak, '{: p}' również działa, specyfikator 'p' [specyfikator formatu] (http://doc.rust-lang.org/nightly/std/fmt/#formatting-traits) jest [zaimplementowany dla różne rodzaje wskaźników] (http://doc.rust-lang.org/nightly/std/fmt/trait.Pointer.html), aby wydrukować tylko adres. – huon

+2

[Typy są określone jako 'let x: Type = 1;'] (http://doc.rust-lang.org/nightly/guide.html#variable-bindings). – huon