Suppose a simple code:
use std::rc::Rc;
use std::vec::Vec;
#[derive(Clone,Eq,PartialEq,Debug,Ord,PartialOrd)]
struct Tree<T:Clone+Eq+PartialEq+Ord+PartialOrd+Copy> {
x : T,
v : Vec<Rc<Tree<T>>>,
}
fn create_nice_tree<T:Clone+Eq+PartialEq+Ord+PartialOrd+Copy> (x : T) -> Tree<T> {
Tree {x: x, v: vec![
Rc::new(Tree{x: x, v: vec![]}),
Rc::new(Tree{x: x, v: vec![]}),
]}
}
fn main() {
let t : Tree<i32> = create_nice_tree(4);
println!("{:?}", t);
}
It works. But what if user wants Arc? How do I abstract this out? Naive attempt fails:
use std::rc::Rc;
use std::vec::Vec;
use std::ops::Deref;
#[derive(Clone,Eq,PartialEq,Debug,Ord,PartialOrd)]
struct Tree<T:Clone+Eq+PartialEq+Ord+PartialOrd+Copy, U:Deref<Target = Tree<T,U>>+Clone > {
x : T,
v : Vec<U<Tree<T>>>,
}
fn create_nice_tree<T:Clone+Eq+PartialEq+Ord+PartialOrd+Copy, U:Deref<Target = Tree<T,U>>+Clone> (x : T) -> Tree<T,U> {
Tree {x: x, v: vec![
U::new(Tree{x: x, v: vec![]}),
U::new(Tree{x: x, v: vec![]}),
]}
}
fn main() {
let t : Tree<i32, Rc> = create_nice_tree(4);
println!("{:?}", t);
}