2017-05-17 28 views
0

假设以下函数存在:合并盒装元素

fn merge(a1: A, a2: A) -> A { /* implemented */ } 

是否有写使用盒装类型相同的操作功能的方法是什么?那就是:

fn boxed_merge(a1: Box<A>, a2: Box<A>) -> Box<A> { /* ??? */ } 
+0

你认为'a1'和'a2'之间的合并是什么? – ljedrz

+0

我认为合并为:merge(a1:A,a2:A) - > A'。编辑我的问题,使其更清楚。 – ynimous

回答

3

您可以重复使用您的merge功能,通过取消引用boxed_merge函数内框。请注意,这不会重新使用分配,而是创建一个新的

fn boxed_merge(a1: Box<A>, a2: Box<A>) -> Box<A> { 
    Box::new(merge(*a1, *a2)) 
} 
+0

重复使用非箱子功能的好主意。 – ljedrz

3

您可以通过提领他们访问的盒装参数的内容,并在新Box将它们结合起来。例如:

fn merge(a1: Box<usize>, a2: Box<usize>) -> Box<usize> { 
    Box::new(*a1 + *a2) 
} 

fn main() { 
    let a1 = Box::new(1); 
    let a2 = Box::new(2); 

    println!("{}", merge(a1, a2)); 
} 
4

我主张一个由价值merge应该是你的基本实现。相反,变异方法提供了更多的灵活性。然后,您可以以此为基础通过价值和盒装价值的方法:

struct A(u8); 

impl A { 
    fn merge_ref(&mut self, other: &A) { 
     self.0 += other.0 
    } 
} 

fn merge(mut a1: A, a2: A) -> A { 
    a1.merge_ref(&a2); 
    a1 
} 

fn boxed_merge(mut a1: Box<A>, a2: Box<A>) -> Box<A> { 
    a1.merge_ref(&a2); 
    a1 
} 

fn main() { 
    let a1 = A(1); 
    let a2 = A(2); 

    let a3 = merge(a1, a2); 

    let boxed_a3 = Box::new(a3); 
    let boxed_a4 = Box::new(A(4)); 

    let boxed_a7 = boxed_merge(boxed_a3, boxed_a4); 

    println!("{}", boxed_a7.0); 
} 

值得注意的是,这将是盒装的情况下更有效,因为你不必进行任何额外拨款。

As oli_obk - ker points out

这仅适用于Copy结构的合并。如果你有这样的合并两个集合,集合的元素可能不是可复制

这可能采取的价值由merge_ref合并的事情,并使用同样的伎俩搬出箱子来解决在boxed_merge方法中:

struct B(Vec<u8>); 

impl B { 
    fn merge_ref(&mut self, other: B) { 
     self.0.extend(other.0) 
    } 
} 

fn merge(mut b1: B, b2: B) -> B { 
    b1.merge_ref(b2); 
    b1 
} 

fn boxed_merge(mut b1: Box<B>, b2: Box<B>) -> Box<B> { 
    b1.merge_ref(*b2); 
    b1 
} 

fn main() { 
    let b1 = B(vec![1]); 
    let b2 = B(vec![2]); 

    let b3 = merge(b1, b2); 

    let boxed_b3 = Box::new(b3); 
    let boxed_b4 = Box::new(B(vec![4])); 

    let boxed_b7 = boxed_merge(boxed_b3, boxed_b4); 

    println!("{:?}", boxed_b7.0); 
} 

我们在这里还没有任何额外的分配。

+0

这仅适用于复制结构的合并。如果您有两个合并的集合,则集合中的元素可能不可复制(例如,“Box ')。 –

+1

@ oli_obk-ker这是真的,但如果是这样的话,我会改为'mergenf(&mut self,other:A)',它有避免无关分配的相同好处。 – Shepmaster