Debug formatatter có sử dụng dereference?
Tôi bối rối không biết làm cách nào để trình định dạng Gỡ lỗi đến cuối chuỗi tham chiếu.
Sự hiểu biết của tôi là println!("{:?}", x)mở rộng đến những thứ như:
... print(&x) ...
vay mượn xthay vì di chuyển / sao chép nó.
Bây giờ bản in này MyNumber(1)thay vì dự kiến &MyNumber(1):
#[derive(Debug)]
struct MyNumber(u8);
fn main() {
let x = MyNumber(1);
println!("{:?}", x);
}
từ đó tôi giả sử rằng trình định dạng Gỡ lỗi tuân theo Dereftriển khai chung được xác định cho tất cả các tham chiếu bằng chính ngôn ngữ Rust ( impl<T> Deref for &T).
Nếu vậy, thì tại sao đoạn mã sau lại in MyNumber(1)thay vì chỉ 1?
use std::ops::{Deref};
#[derive(Debug)]
struct MyNumber(u8);
impl Deref for MyNumber {
type Target = u8;
fn deref(&self) -> &Self::Target {
&self.0
}
}
fn main() {
let x = MyNumber(1);
println!("{:?}", x);
}
Đối với tôi, dường như trình định dạng Gỡ lỗi tuân theo việc Dereftriển khai trên &Tchính ngôn ngữ Rust nhưng bỏ qua việc Dereftriển khai trên kiểu tùy chỉnh của tôi.
Có ai biết tại sao điều này xảy ra? Bất kỳ giúp đỡ nhiều đánh giá cao!
Trả lời
Có ai biết tại sao điều này xảy ra? Bất kỳ giúp đỡ nhiều đánh giá cao!
Nếu bạn kiểm tra tài liệu cho Debug thì tìm kiếm xung quanh bạn sẽ thấy :
impl<'_, T> Debug for &'_ T where
T: Debug + ?Sized,
Có nghĩa là có một triển khai hàng loạt cụ thể trên các tham chiếu ủy nhiệm cho đối tượng cơ bản. Mà trong trường hợp của bạn là MyNumber, tại thời điểm đó là những gì được sử dụng.
Không có triển khai cho Deref, thay vào đó có các triển khai cho từng loại con trỏ thông minh (nếu bạn tìm kiếm trong trang, bạn sẽ tìm thấy các triển khai cho Boxvà Rc).
Vì vậy, mã của bạn in MyNumber(1)bởi vì đó là những gì nó được yêu cầu làm: nó gọi việc Debugtriển khai trên MyNumber. Nếu bạn muốn một cái gì đó khác, bạn cần phải triển khai (không dẫn xuất) Debugđể ủy quyền cho kiểu cơ bản của nó.