【发布时间】:2020-09-15 15:37:45
【问题描述】:
我的目标是将元素移出拥有的Vec。
fn f<F>(x: Vec<F>) -> F {
match x.as_slice() {
&[a, b] => a,
_ => panic!(),
}
}
如果F 是副本,那没问题,因为可以简单地从切片中复制出来。当F 不是时,切片模式似乎是不可行的,因为切片是只读的。
是否存在诸如“拥有的切片”或Vec 上的模式匹配之类的东西,可以将元素移出x?
编辑:我现在看到这段代码有更普遍的问题。功能
fn f<T>(x: Vec<T>) -> T {
x[0]
}
留下“Vec 中的一个洞”,即使它随后被丢弃。这是不允许的。 This post 和 this discussion 描述了这个问题。
这导致了更新的问题:Vec<T> 如何被正确地用于进行模式匹配?
【问题讨论】:
-
你的函数返回
F,这意味着它必须移动、复制或克隆项目。 -
假设您可以从向量中移动一个元素,您希望向量处于什么状态?
-
@PeterHall 完全正确:我想搬家(问题已编辑)。
-
@E_net4theRustacean 我希望删除
Vec。
标签: rust pattern-matching slice ownership