2014-05-02 56 views
4

爲什麼引用特徵對象不可複製?此代碼編譯:特徵對象的引用不可複製

struct Test; 

fn clone_vec<'a>(v: Vec<&'a Test>) -> Vec<&'a Test> { 
    v.clone() 
} 

fn main() { 
} 

這一個不:

trait Test { 
    fn do_smt(&self); 
} 

fn clone_vec<'a>(v: Vec<&'a Test>) -> Vec<&'a Test> { 
    v.clone() 
} 

fn main() { 
} 

錯誤:

main3.rs:7:5: 7:14 error: failed to find an implementation of trait std::clone::Clone for &'a Test<no-bounds> 
main3.rs:7  v.clone() 
       ^~~~~~~~~ 

然而,Clone特質是任何種類的參考實現,盡我所能參見:

impl<'a, T> Clone for &'a T { 
    /// Return a shallow copy of the reference. 
    #[inline] 
    fn clone(&self) -> &'a T { *self } 
} 

我只是不明白爲什麼&'a Test其中Test是一個不可複製的特徵。畢竟它只是一個指針。例如,該限制禁止從&[&'a SomeTrait]Vec<&'a SomeTrait>,這看起來像一個明顯的轉換,或者克隆Vec<&'a SomeTrait>,如示例中所示。

這是很奇怪的規定,我可以實現自己clone_vec(),沒有Clone

fn clone_vec<'a>(v: Vec<&'a Test>) -> Vec<&'a Test> { 
    let mut result = Vec::new(); 
    for &e in v.iter() { 
     result.push(e); 
    } 
    result 
} 

回答

4

Clone是正常的庫特徵,並且需要正常(庫)的實施,爲所有類型的。例如,Clone&Tright here實現形式:

impl<'a, T> Clone for &'a T { 
    /// Return a shallow copy of the reference. 
    #[inline] 
    fn clone(&self) -> &'a T { *self } 
} 

因此,形式&T的一切都是Clone能...其中T具體類型。這就是重點:&Trait還不是&TT = Trait(而是一個「原子」/原始類型,不能被分成部分)&T類型,所以它不包括在impl

我們需要動態調整大小的類型(DST),以便編譯器能夠推斷僅將普通舊的Trait作爲通用參數傳遞(Nick Cameron實際上在DST實現的某些部分工作很努力,所以這會希望很快發生)。

但是,您可以爲感興趣的特徵手動實施Clone,例如,以下工作得好:

trait Foo {} 

impl<'a> Clone for &'a Foo { 
    fn clone(&self) -> &'a Foo { 
     *self 
    } 
} 

然而,它僅適用於在當前的箱子定義的特徵,否則編譯器大約有連貫性(例如,在impl改變FooEq上述原因error: cannot provide an extension implementation where both trait and type are not defined in this crate)的擔憂。

+0

這就是我所懷疑的。我將等待DST。看起來這將是一個驚人的變化,許多新功能讓人們的生活變得輕鬆:)非常感謝你! –

相關問題