У меня есть ссылка на ржавую площадку здесь , а полный код для моего примера с базовым c:
trait Obj {
fn hit(&self, t0: f64, t1: f64) -> bool;
}
struct Leaf {
data: f64,
}
impl Obj for Leaf {
fn hit(&self, t0: f64, t1: f64) -> bool { return t0 < self.data && self.data < t1 }
}
struct Node<'a> {
data: f64,
left: &'a Box<dyn Obj>,
right: &'a Box<dyn Obj>,
}
impl<'a> Obj for Node<'a> {
fn hit(&self, t0: f64, t1: f64) -> bool {
self.left.hit(t0, t1) || self.right.hit(t0, t1)
}
}
impl<'a> Node<'a> {
fn new(tmin: f64, tmax: f64) -> Self {
let mid = (tmin + tmax) / 2.;
if tmax - tmin < 1. {
return Self { data: tmin, left: &Box::new(Leaf {data: tmin }), right: &Box::new(Leaf {data :tmax} ) };
}
let left = Node::new(tmin, mid);
let right = Node::new(mid, tmax);
Self {data: tmin, left: &Box::new(left), right: &Box::new(right) }
}
}
fn main() {
let node = Node::new(0., 100.);
()
}
Это надуманный пример, но он дает то же самое ошибки компилятора я получаю в своей реальной версии. В конструкторе для Node я получаю следующие ошибки:
error[E0308]: mismatched types
--> src/main.rs:29:83
|
29 | return Self { data: tmin, left: &Box::new(Leaf {data: tmin }), right: &Box::new(Leaf {data :tmax} ) };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected trait object `dyn Obj`, found struct `Leaf`
|
= note: expected reference `&'a std::boxed::Box<(dyn Obj + 'static)>`
found reference `&std::boxed::Box<Leaf>`
error[E0308]: mismatched types
--> src/main.rs:33:33
|
33 | Self {data: tmin, left: &Box::new(left), right: &Box::new(right) }
| ^^^^^^^^^^^^^^^ expected trait object `dyn Obj`, found struct `Node`
|
= note: expected reference `&'a std::boxed::Box<(dyn Obj + 'static)>`
found reference `&std::boxed::Box<Node<'_>>`
Почему я получаю эти ошибки? И Leaf
, и Node
реализуют Obj
, и я понимаю, что они оба могут быть типа dyn Obj
. Я думаю, это как-то связано с жизнями, но не могу придумать, как это исправить. Как правильно создать эту двоичную древовидную структуру в Rust?