2015-01-09 9 views
14

ポインタを印刷すると、逆参照されたポインタを印刷するのと同じことが印刷されるのはなぜですか?錆ガイドから

逆参照(むしろ参照自体よりも言及されている値を取得)y、我々はアスタリスク(*

を使用するので、私はそれをやった:

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

これは私に同じ結果が得られる(X = 1、Y = 1)であっても、明示的な逆参照することなく:

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

なぜですか? ptr_yメモリアドレスを印刷し、*ptr_y印刷する必要はありませんか?何かの自動参照がありますか、私は何かを逃しましたか?

答えて

17

錆は、通常、オブジェクトのアイデンティティ(メモリアドレス)ではなく、オブジェクトの値(コンテンツの興味深い部分)に焦点を当てます。 &Timplementation of Displayは、Displayを実装しています。Displayは、内容物に直接的に入ります。 DisplayString実現のために、手動でそのマクロを展開する:ある

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

を、それだけで直接その内容を印刷しています。

オブジェクトのID /メモリアドレスを気にする場合は、Pointer formatterを使用することができ、{:p}

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

出力:

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

playground

+2

私はおよそ錆ガイドで読みますあなたの投稿の後にちょっとしたポインタがあり、 "{:p}、ptr_y"は "println!が自動的に参照解除する"ために使用されます。 短い質問: 私は通常 "タイプ名=値"または "intテスト= 1"のようなものを使用します。私はオプションとして、 "int int test = 1"をコンパイルエラーとしています。私はコンパイラが型を自動的に取得することを知っていますが、私の構文のために私は宣言するときに私のコードに書いています:(。 とにかく、マクロが正確に何をしているのかわからない場合でも、 )。 – Vega

+3

ああ、そうです、 '{:p}'も動作し、 'p' [フォーマット指定子](http://doc.rust-lang.org/nightly/std/fmt/#formatting-traits)は[様々な種類のポインタ](http://doc.rust-lang.org/nightly/std/fmt/trait.Pointer.html)を使用してアドレスを印刷するだけです。 – huon

+2

[タイプは 'let x:Type = 1;'](http://doc.rust-lang.org/nightly/guide.html#variable-bindings)として指定されています。 – huon

関連する問題