Rustガイドから:
逆参照(参照自体ではなく参照される値を取得する)
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
印刷1?ある種の自動逆参照はありますか、それとも何かを見逃しましたか?
Rustは通常、オブジェクトID(メモリアドレス)ではなく、オブジェクト値(つまり、コンテンツの興味深い部分)に焦点を当てています。 Display
の実装 for &T
ここで、T
はDisplay
を実装し、コンテンツに直接依存します。 String
のDisplay
実装用にそのマクロを手動で展開します。
impl<'a> Display for &'a String {
fn fmt(&self, f: &mut Formatter) -> Result {
Display::fmt(&**self, f)
}
}
つまり、コンテンツを直接印刷するだけです。
オブジェクトのアイデンティティ/メモリアドレスを気にする場合は、 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
fn main() {
let x = &42;
let address = format!("{:p}", x); // this produces something like '0x7f06092ac6d0'
println!("{}", address);
}