2 回答

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超11個(gè)贊
Vec<Animal>是不合法的,但是編譯器無(wú)法告訴您,因?yàn)轭愋筒黄ヅ湟阅撤N方式將其隱藏。如果我們刪除對(duì)的調(diào)用push,則編譯器將給我們以下錯(cuò)誤:
<anon>:22:9: 22:40 error: instantiating a type parameter with an incompatible type `Animal`, which does not fulfill `Sized` [E0144]
<anon>:22 let mut v: Vec<Animal> = Vec::new();
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
之所以不合法,是因?yàn)閍 在內(nèi)存中連續(xù)Vec<T>存儲(chǔ)了許多T對(duì)象。但是,Animal是一個(gè)特征,特征沒(méi)有大?。ú荒鼙WCa Cat和a Dog具有相同的大小)。
要解決此問(wèn)題,我們需要在中存儲(chǔ)大小為一定的內(nèi)容Vec。最直接的解決方案是將這些值包裝在Box,即中Vec<Box<Animal>>。Box<T>具有固定大小(如果T是特征,則為“胖指針”,否則為簡(jiǎn)單指針)。
這是一個(gè)工作main:
fn main () {
let dog: Dog = Dog;
let cat: Cat = Cat;
let mut v: Vec<Box<Animal>> = Vec::new();
v.push(Box::new(cat));
v.push(Box::new(dog));
for animal in v.iter() {
println!("{}", animal.make_sound());
}
}

TA貢獻(xiàn)1890條經(jīng)驗(yàn) 獲得超9個(gè)贊
您可以使用參考特征對(duì)象&Animal借用元素并將這些特征對(duì)象存儲(chǔ)在中Vec。然后,您可以枚舉它并使用特征的界面。
Vec通過(guò)&在trait前面添加a 來(lái)更改的通用類型將起作用:
fn main() {
let dog: Dog = Dog;
let cat: Cat = Cat;
let mut v: Vec<&Animal> = Vec::new();
// ~~~~~~~
v.push(&dog);
v.push(&cat);
for animal in v.iter() {
println!("{}", animal.make_sound());
}
// Ownership is still bound to the original variable.
println!("{}", cat.make_sound());
}
如果您可能希望原始變量保留所有權(quán)并在以后重新使用,那就太好了。
請(qǐng)牢記上述情況,您不能轉(zhuǎn)讓的所有權(quán),dog或者cat因?yàn)閂ec曾在相同范圍借用了這些具體實(shí)例。
引入新的作用域可以幫助處理特定情況:
fn main() {
let dog: Dog = Dog;
let cat: Cat = Cat;
{
let mut v: Vec<&Animal> = Vec::new();
v.push(&dog);
v.push(&cat);
for animal in v.iter() {
println!("{}", animal.make_sound());
}
}
let pete_dog: Dog = dog;
println!("{}", pete_dog.make_sound());
}
- 2 回答
- 0 關(guān)注
- 542 瀏覽
添加回答
舉報(bào)