2017-05-17 3 views
0

?それは次のとおりです。マージ箱入り要素

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

'a1'と' a2'の合併についてどう思いますか? – ljedrz

+0

私はマージを 'merge(a1:A、a2:A) - > A'と考えます。これをより明確にするために私の質問を編集しました。 – ynimous

答えて

3

あなたがboxed_merge関数内のボックスを参照解除することで、あなたのmerge機能を再利用することができます。これは割り当てを再利用ではなく、私はそのAを提唱う

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構造のマージのために適用されます。あなたがマージされている2つのセットを持っていた場合、セットの要素がコピー可能ではないかもしれません

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

これは、Copy構造のマージにのみ適用されます。結合された2つのセットがある場合、セットの要素はコピーできません(例: 'Box ')。 –

+1

@ oli_obk-kerそれは本当ですが、もしそうなら、私はfn merge_ref(&mut self、other:A)に変更します。これは、無関係な割り当てを避けるという同じ利点を持っています。 – Shepmaster