2015-01-09 5 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

녹이기는 대개 객체 ID (메모리 주소)보다는 객체 값 (즉 내용의 흥미로운 부분)에 초점을 둡니다. &T에 대한 implementation of DisplayDisplay을 구현하는 T이 내용물에 직접 방역됩니다. DisplayString 구현을 위해 수동으로 매크로를 확장 :입니다

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 

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