gpt4 book ai didi

rust - 我如何(切片)在拥有的 Vec 上与非复制元素进行模式匹配?

转载 作者:行者123 更新时间:2023-12-03 11:33:14 27 4
gpt4 key购买 nike

我的目标是将元素从拥有的 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 postthis discussion描述那个问题。

这导致了更新的问题:Vec<T> 怎么能被适当消耗以进行模式匹配?

最佳答案

如果你坚持模式匹配,你可以这样做:

fn f<F>(x: Vec<F>) -> F {
let mut it = x.into_iter();
match (it.next(), it.next(), it.next()) {
(Some(x0), Some(_x1), None) => x0,
_ => panic!(),
}
}

但是,如果您只想检索 2 元素向量的第一个元素(在其他情况下 panic ),我想我宁愿这样做:

fn f<F>(x: Vec<F>) -> F {
assert_eq!(x.len(), 2);
x.into_iter().next().unwrap()
}

关于rust - 我如何(切片)在拥有的 Vec 上与非复制元素进行模式匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62062717/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com