Hello,
I want to ask what is the most idiomatic solution for solving compilation errors of following code:
use std::sync::{Arc, Mutex};
struct Bulldog;
struct Ragdoll;
trait Walk {}
trait Bark {}
trait Meow {}
trait Dog: Walk + Bark {}
trait Cat: Walk + Meow {}
impl Walk for Bulldog {}
impl Bark for Bulldog {}
impl Dog for Bulldog {}
impl Walk for Ragdoll {}
impl Meow for Ragdoll {}
impl Cat for Ragdoll {}
fn walk_ref(item: &dyn Walk) {}
fn walk_arc(item: Arc<dyn Walk>) {}
fn walk_locked(item: Arc<Mutex<dyn Walk>>) {}
fn main() {
let dog: &dyn Dog = &Bulldog;
let cat: &dyn Cat = &Ragdoll;
walk_ref(dog);
walk_ref(cat);
let dog: Arc<dyn Dog> = Arc::new(Bulldog);
let cat: Arc<dyn Cat> = Arc::new(Ragdoll);
walk_arc(dog);
walk_arc(cat);
let dog: Arc<Mutex<dyn Dog>> = Arc::new(Mutex::new(Bulldog));
let cat: Arc<Mutex<dyn Cat>> = Arc::new(Mutex::new(Ragdoll));
walk_locked(cat);
walk_locked(dog);
}
error[E0308]: mismatched types
--> src/main.rs:27:14
|
27 | walk_ref(dog);
| ^^^ expected trait `Walk`, found trait `Dog`
|
= note: expected type `&dyn Walk`
found type `&dyn Dog`
...