gpt4 book ai didi

rust - 如何将 Vec 解构为拥有所有权的变量?

转载 作者:行者123 更新时间:2023-11-29 08:05:10 26 4
gpt4 key购买 nike

我有一个结构

struct Foo {
foo1: String,
foo2: String,
foo3: String,
foo4: String,
// ...
}

我想从向量创建一个 Foo 的实例。

let x = vec!["a".to_string(), "b".to_string(), "c".to_string(), "d".to_string()];
match x.as_slice() {
&[ref a, ref b, ref c, ref d] => {
let foo = Foo {
foo1: a.to_string(),
foo2: b.to_string(),
foo3: c.to_string(),
foo4: d.to_string(),
};

},
_ => unreachable!(),
}

我必须复制字符串吗?有没有更好的方法将向量解构为 abcd 以及传输所有权?

其实,我不介意x在解构后被完全销毁。所以我希望除了切片之外也有向量的模式匹配。目前看来我们只能解构切片。

最佳答案

Do I have to copy the strings?

如果您愿意放弃解构,则不会。我是 itertools 的忠实粉丝:

use itertools::Itertools; // 0.8.2

fn main() {
let x = vec![
"a".to_string(),
"b".to_string(),
"c".to_string(),
"d".to_string(),
];

if let Some((foo1, foo2, foo3, foo4)) = x.into_iter().tuples().next() {
let foo = Foo {
foo1,
foo2,
foo3,
foo4,
};
}
}

这会将向量(以及成员)的所有权转移到迭代器,然后 tuples 适配器将值分块到一个元组中。我们采用其中的第一个并构建值。

如果你不想放弃整个向量的所有权,你也可以使用 drain:

if let Some((foo1, foo2, foo3, foo4)) = x.drain(..4).tuples().next() {

Is there any better way to destructure the vector into a, b, c, d as well as transferring the ownership?

不,除了迭代器之外,没有任何机制可以在不创建另一个 Vec(或具有相同限制的其他类型)的情况下取得 Vec 的一部分的所有权.

关于rust - 如何将 Vec 解构为拥有所有权的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43657570/

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