2015-01-09 24 views
14

Từ hướng dẫn Rust:Tại sao in một con trỏ in giống như in con trỏ dereferenced?

Để dereference (lấy giá trị được gọi chứ không phải là tài liệu tham khảo chính nó) y, chúng ta sử dụng dấu hoa thị (*)

Vì vậy, tôi đã làm điều đó:

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

Điều này mang lại cho tôi kết quả tương tự (x = 1; y = 1) ngay cả khi không có sự chú ý rõ ràng:

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

Tại sao? Không nên ptr_y in địa chỉ bộ nhớ và *ptr_y in 1? Có một số loại dereference tự động hoặc tôi đã bỏ lỡ một cái gì đó?

Trả lời

17

Rust thường tập trung vào giá trị đối tượng (tức là phần thú vị của nội dung) thay vì nhận dạng đối tượng (địa chỉ bộ nhớ). implementation of Display cho &T trong đó T thực hiện Display sẽ chuyển trực tiếp nội dung. Mở rộng macro bằng tay để thực hiện String của Display:

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

Nghĩa là, nó chỉ là in nội dung của nó trực tiếp.

Nếu bạn quan tâm đến đối tượng sắc/địa chỉ bộ nhớ, bạn có thể sử dụng Pointer formatter, {:p}:

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

Output:

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

playground

+2

Tôi đọc ở hướng dẫn Rust về con trỏ một chút sau khi gửi bài của bạn và họ chỉ sử dụng "{: p}, ptr_y" bởi vì "println! sẽ tự động dereference nó cho chúng tôi". Một câu hỏi ngắn: Tôi thường sử dụng một cái gì đó như "Loại tên = giá trị" hoặc "int test = 1". Có vẻ như tôi không thể có trong Rust như một lựa chọn, "let int test = 1" cho lỗi trình biên dịch? Tôi biết trình biên dịch nhận được loại tự động nhưng vì lợi ích của cú pháp của tôi, tôi muốn viết nó trong mã của tôi khi tuyên bố: ( Dù sao, cảm ơn câu trả lời của bạn ngay cả khi tôi không biết chính xác macro đang làm gì:). – Vega

+3

Ồ, vâng, '{: p}' cũng hoạt động, 'p' [format specifier] (http://doc.rust-lang.org/nightly/std/fmt/#formatting-traits) là [được triển khai cho các loại con trỏ khác nhau] (http://doc.rust-lang.org/nightly/std/fmt/trait.Pointer.html) để chỉ in địa chỉ. – huon

+2

[Các kiểu được chỉ định là 'let x: Type = 1;'] (http://doc.rust-lang.org/nightly/guide.html#variable-bindings). – huon

Các vấn đề liên quan