2015-05-15 43 views
5

Özel bir tür için Debug özelliğinin uygulanmaya çalışılması, Vec<T> numaralı uygulamaya yönelik olarak gerçekleştirildi. Nasıl çalıştığını anlamakta güçlük çekiyorum.Vec için Hata Ayıklama uygulamasını anlama <T>

uygulaması şöyledir:

impl<T: fmt::Debug> fmt::Debug for Vec<T> { 
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 
     fmt::Debug::fmt(&**self, f) 
    } 
} 

Diğer bazı türü için fmt uygulanmasını çağırır anlıyoruz. Anlayamadığım şey, ne tür bir şey. Ben another question yardımı ile anlamaya çalıştım ve uygun görünen bir şey (&[T] gibi bir şey) için arama, ama hiçbir başarı ile implementations of Debug arasında arama.

Bu bağlamda &**self tam anlamı nedir? Debug'un hangi uygulaması çağrılıyor?

cevap

8

Böyle durumlarda, derleyicinin türün ne olduğunu size bildirmesini sağlıyorum. Sadece bir tür hataya neden olun ve derleyici tanılamaların sizin için yapmasına izin verin. En kolay yolu tip () ait bir şey için öğeyi atamak çalışmaktır:

fn main() { 
    let v = &vec![1,2,3]; 
    let() = v; 
    let() = &**v; 
} 

hataları şunlardır:

<anon>:3:9: 3:11 error: mismatched types: 
expected `&collections::vec::Vec<_>`, 
    found `()` 
(expected &-ptr, 
    found()) [E0308] 
<anon>:3  let() = v; 
       ^~ 
<anon>:4:9: 4:11 error: mismatched types: 
expected `&[_]`, 
    found `()` 
(expected &-ptr, 
    found()) [E0308] 
<anon>:4  let() = &**v; 
       ^~ 

Böylece v bir &collections::vec::Vec<_> ve &**v bir &[_] olmasıdır. bir kez bir &[T] almak için bir kez başvuru sonra [T] almak için tekrar KQUEUE, bir Vec<T> için &Vec<T> gitmek, ve KQUEUE, Yani

impl<T> Deref for Vec<T> { 
    type Target = [T]; 
    // ... 
} 

: Daha detaylı

, Vec bu vardır.

[T] bu vardır: çağırmak için uygun bir yöntemle ararken

impl<T> Debug for [T] { 
    fn fmt(&self, ...) ...; 
} 

Ancak, Pas hedefini automatically attempt to dereference edecektir. Yani &[T]'dan [T] yöntemini bulabiliyoruz.

corrected by Francis Gagné gibi, Debug::fmt&self sürer, bu nedenle doğrudan bir &[T] ile çağırarak eşleşen uygulamasını bulur. Herhangi bir otomatik referansa ya da referansa gerek yoktur.

+0

Teşekkür ederiz! Ben sadece bir şeyi özlüyorum: [T] 'için bir uygulama buldum ama' & [T] 'için değil, aranan ikinci kişi mi? Niye ya? – toro2k

+1

@ toro2k Bunun hakkında biraz daha ekledim. Yardımcı olursa haberim olsun! – Shepmaster

+2

Otomatik dereferencing (veya otomatik referanslama) olduğunu düşünmüyorum, çünkü fmt :: Debug :: fmt() ', 'self' referansla alır, yani bir & # T) bekler ve bir '& [T] 'verildi. –