gpt4 book ai didi

arrays - 如何在不复制的情况下将字符串值从数组移动到元组?

转载 作者:行者123 更新时间:2023-11-29 07:58:12 24 4
gpt4 key购买 nike

我有一个固定大小的 String 数组:[String; 2]。我想把它变成一个 (String, String)。我可以在不复制值的情况下执行此操作吗?

我正在处理的代码片段如下:

let (basis, names_0, names_1) = if let Some(names) = self.arg_name {
(ComparisonBasis::Name, names[0], names[1])
} else {
(ComparisonBasis::File, self.arg_file[0], self.arg_file[1])
};

类型:

self.arg_name: Option<[String; 2]>
self.arg_file: Vec<String>

现在我遇到了错误

cannot move out of type `[std::string::String; 2]`, a non-copy fixed-size array [E0508]

cannot move out of indexed content [E0507]

对于 if 的两个分支

最佳答案

您省略了相当多的上下文,所以我在几个方面进行猜测。我也更接近您的问题,而不是您的片段所暗示的更模糊的问题。

struct NeverSpecified {
arg_names: Option<[String; 2]>,
arg_file: Vec<String>,
}

impl NeverSpecified {
fn some_method_i_guess(mut self) -> (String, String) {
if let Some(mut names) = self.arg_names {
use std::mem::replace;
let name_0 = replace(&mut names[0], String::new());
let name_1 = replace(&mut names[1], String::new());
(name_0, name_1)
} else {
let mut names = self.arg_file.drain(0..2);
let name_0 = names.next().expect("expected 2 names, got 0");
let name_1 = names.next().expect("expected 2 names, got 1");
(name_0, name_1)
}
}
}

我使用 std::mem::replace切换数组的内容,同时将其保留在有效状态。这是必要的,因为 Rust 不允许你有一个“部分有效”的数组。此路径中不涉及副本或分配。

在另一条路径中,我们必须手动将元素从向量中拉出。同样,您不能仅通过索引将值移出容器(这实际上是整体索引的限制)。相反,我使用 Vec::drain从本质上将前两个元素从向量中切掉,然后从生成的迭代器中提取它们。需要明确的是:此路径不涉及任何副本或分配,要么

顺便说一句,那些 expect 方法不应该被触发(因为 drain 进行边界检查),但偏执总比后悔好;如果您想用 unwrap() 调用替换它们,那应该没问题..

关于arrays - 如何在不复制的情况下将字符串值从数组移动到元组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38290790/

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