Rust提供了一些在用户定义的结构中存储元素集合的方法。可以为结构提供自定义生存期说明符和对切片的引用:
struct Foo<'a> {
elements: &'a [i32]
}
impl<'a> Foo<'a> {
fn new(elements: &'a [i32]) -> Foo<'a> {
Foo { elements: elements }
}
}
或者可以给它一个Vec
对象:
struct Bar {
elements: Vec<i32>
}
impl Bar {
fn new(elements: Vec<i32>) -> Bar {
Bar { elements: elements }
}
}
这两种方法有哪些主要区别?
Vec
时,是否会使用Bar::new(vec![1, 2, 3, 4, 5])
强制语言复制内存? Vec
超出范围时,是否会隐式销毁Bar
的内容? 答案 0 :(得分:10)
Vec
由三部分组成:
切片由两部分组成:
无论何时移动其中任何一个,这些字段都将被复制。正如你可能猜到的那样,它非常轻巧。堆上的实际内存块不会被复制或移动。
Vec
表示内存的所有权,而切片表示内存借用。当Vec
本身被解除分配时,{{ line_item.price | times: 2 | money }}
需要释放所有项目和内存块(在Rust-speak中删除)。当它超出范围时会发生这种情况。切片掉落时切片什么都不做。
使用切片没有危险,因为这是Rust 生命周期处理的内容。这些确保您从不使用引用后它将失效。