Aşağıdaki kod segmenti bana bir hata veriyor:Parametre tipi yeterince uzun süre canlı değil mi?
use std::rc::Rc;
// Definition of Cat, Dog, and Animal (see the last code block)
// ...
type RcAnimal = Rc<Box<Animal>>;
fn new_rc_animal<T>(animal: T) -> RcAnimal
where
T: Animal, /* + 'static */ // works fine if uncommented
{
Rc::new(Box::new(animal) as Box<Animal>)
}
fn main() {
let dog: RcAnimal = new_rc_animal(Dog);
let cat: RcAnimal = new_rc_animal(Cat);
let mut v: Vec<RcAnimal> = Vec::new();
v.push(cat.clone());
v.push(dog.clone());
for animal in v.iter() {
println!("{}", (**animal).make_sound());
}
}
error[E0310]: the parameter type `T` may not live long enough
--> src/main.rs:8:13
|
4 | fn new_rc_animal<T>(animal: T) -> RcAnimal
| - help: consider adding an explicit lifetime bound `T: 'static`...
...
8 | Rc::new(Box::new(animal) as Box<Animal>)
| ^^^^^^^^^^^^^^^^
|
note: ...so that the type `T` will meet its required lifetime bounds
--> src/main.rs:8:13
|
8 | Rc::new(Box::new(animal) as Box<Animal>)
| ^^^^^^^^^^^^^^^^
ama bu ince derler:
use std::rc::Rc;
// Definition of Cat, Dog, and Animal (see the last code block)
// ...
fn new_rc_animal<T>(animal: T) -> Rc<Box<T>>
where
T: Animal,
{
Rc::new(Box::new(animal))
}
fn main() {
let dog = new_rc_animal(Dog);
let cat = new_rc_animal(Cat);
}
Hatanın nedeni nedir? Tek gerçek fark, operatörün as
kullanımıdır. tip nasıl uzun süre canlı kalmaz? Bir ömür boyu parametresine sahip tüm olanlar: (playground)
// Definition of Cat, Dog, and Animal
trait Animal {
fn make_sound(&self) -> String;
}
struct Cat;
impl Animal for Cat {
fn make_sound(&self) -> String {
"meow".to_string()
}
}
struct Dog;
impl Animal for Dog {
fn make_sound(&self) -> String {
"woof".to_string()
}
}
teşekkürler hızlı cevap için çok şey var ... Ama kısa ömürlü tipin kullanımı nedir? Derleyici üzerinde herhangi bir performans optimizasyonu yapabilir mi? – John
Aslında kullanım, daha sonra bir tür yaşam boyu diğerine bağlanır. Örneğin, bir yineleyicinin ömrü, üzerinde yinelediğiniz nesnenin kullanım ömrüne bağlıdır ve bu, türüne yansıtılır. – Levans
@JohnFrancis: Kısa ömürlü bir başka örnek: fonksiyonunuzdaki bir değişkenin referansı => değişken kısa ömürlü (fonksiyonun sonunda yok edilecektir) ve bu nedenle bunun için değer hesabına referanslar (Artık bu değişkeni artık bir kez referans vermekten kaçınmak için). –