假设以下函数存在:合并盒装元素
fn merge(a1: A, a2: A) -> A { /* implemented */ }
是否有写使用盒装类型相同的操作功能的方法是什么?那就是:
fn boxed_merge(a1: Box<A>, a2: Box<A>) -> Box<A> { /* ??? */ }
假设以下函数存在:合并盒装元素
fn merge(a1: A, a2: A) -> A { /* implemented */ }
是否有写使用盒装类型相同的操作功能的方法是什么?那就是:
fn boxed_merge(a1: Box<A>, a2: Box<A>) -> Box<A> { /* ??? */ }
您可以重复使用您的merge
功能,通过取消引用boxed_merge
函数内框。请注意,这不会重新使用分配,而是创建一个新的
fn boxed_merge(a1: Box<A>, a2: Box<A>) -> Box<A> {
Box::new(merge(*a1, *a2))
}
重复使用非箱子功能的好主意。 – ljedrz
您可以通过提领他们访问的盒装参数的内容,并在新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));
}
我主张一个由价值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);
}
值得注意的是,这将是盒装的情况下更有效,因为你不必进行任何额外拨款。
这仅适用于
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);
}
我们在这里还没有任何额外的分配。
这仅适用于复制结构的合并。如果您有两个合并的集合,则集合中的元素可能不可复制(例如,“Box
@ oli_obk-ker这是真的,但如果是这样的话,我会改为'mergenf(&mut self,other:A)',它有避免无关分配的相同好处。 – Shepmaster
你认为'a1'和'a2'之间的合并是什么? – ljedrz
我认为合并为:merge(a1:A,a2:A) - > A'。编辑我的问题,使其更清楚。 – ynimous