Debug formatter, referans kullanıyor mu?
Debug formatlayıcısının referans zincirinin sonuna nasıl ulaştığı konusunda kafam karıştı.
Anladığım kadarıyla println!("{:?}", x)şuna benzer bir şeye genişler:
... print(&x) ...
xonu taşımak / kopyalamak yerine ödünç alan .
Şimdi bu MyNumber(1), beklenen yerine yazdırır &MyNumber(1):
#[derive(Debug)]
struct MyNumber(u8);
fn main() {
let x = MyNumber(1);
println!("{:?}", x);
}
Bundan Debug formatlayıcının DerefRust dilinin kendisi ( impl<T> Deref for &T) tarafından tüm referanslar için tanımlanan genel uygulamayı izlediğini varsayıyorum .
Öyleyse, neden MyNumber(1)sadece yerine aşağıdaki kod yazdırılıyor 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);
}
Bana öyle geliyor ki, Hata Ayıklama biçimlendiricisi Rust dilinin kendisi tarafından Derefuygulanmış olanı takip ediyor, &Tancak Derefbenim özel türümde uygulanmış olanı yok sayıyor .
Bunun neden olduğunu bilen var mı? Herhangi bir yardım çok takdir!
Yanıtlar
Bunun neden olduğunu bilen var mı? Herhangi bir yardım çok takdir!
Hata Ayıklama belgelerini kontrol ederseniz, etrafta arama yaparsanız şunları bulacaksınız :
impl<'_, T> Debug for &'_ T where
T: Debug + ?Sized,
Yani, özellikle temel alınan nesneyi temsil eden referanslarda toplu uygulama vardır. Sizin durumunuzda, MyNumberhangi noktada kullanılan budur.
İçin bir uygulama yoktur Deref, bunun yerine her akıllı işaretçi türü için uygulamalar vardır (sayfada arama yaparsanız Boxve için uygulamaları bulacaksınız Rc).
Böylece kodunuz yazdırılır MyNumber(1)çünkü yapması söylenen budur: Debugüzerinde uygulamayı çağırır MyNumber. Farklı bir şey istiyorsanız Debug, temel alınan türe delege etmek için uygulamanız (türetmemeniz) gerekir.