gpt4 book ai didi

rust - 追加到 for 循环内的字符串

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

我正在尝试通过在 for 循环中附加到它来构建一个字符串。由于某种原因,字符串被移入 for 循环,我无法让它工作。我显然错过了一些东西。这是展示此行为的简短代码片段:

fn main() {
let s = format!("some string");
for x in vec!(1,2).move_iter() {
s.append("some other string");
}
}

我从编译器 (rustc 0.11.0-pre (c0a6f72 2014-06-12 14:17:13 +0000)) 得到以下错误:

test.rs:4:9: 4:10 error: use of moved value: `s`
test.rs:4 s.append("some other string");
^
test.rs:4:9: 4:10 note: `s` moved here because it has type `collections::string::String`, which is non-copyable (perhaps you meant to use clone()?)
test.rs:4 s.append("some other string");
^
error: aborting due to previous error

最佳答案

更新:在最新的 Rust 中(从 1.0.0-alpha 开始)append()方法不再存在。然而,StringVec+方法重载,它的行为与旧的 append() 完全一样:

let s = String::new() + "some part" + "next part";

运算符总是按值获取它们的操作数,因此这不会导致不必要的重新分配。正确的操作数必须是 &str对于 String&[T]对于 Vec<T> ;在后一种情况下,T必须是 Clone .

无论如何,push_str()仍然可用。


你得到这个错误的原因是你使用了错误的方法:)

String::append()方法类似于构建器;它应该像这样使用:

let s = String::new()
.append("some part")
.append("next part");

事实上,您将能够在您的代码中使用它:

let mut s = "some string".to_string();
for &x in [1, 2].iter() {
s = s.append("some other string"); // note the reassignment
}

发生这种情况是因为 append()有这个签名:

fn append(self, other: &str) -> String { ... }

也就是说,它按值获取接收者,并将其移入调用中。它允许轻松链接,但如果您需要修改现有变量,则有些不便。

您正在寻找的方法称为 push_str() :

let mut s = "some string".to_string();
for &x in [1, 2].iter() {
s.push_str("some other string");
}

它只是将传递的字符串切片附加到现有的 String .请注意,您还必须标记 s作为可变的。您也不需要使用 vec!() 分配新向量, 静态数组就足够了。

也就是说,如果可能的话,最好完全避免突变。 @A.B. 建议使用 fold()绝对正确。

关于rust - 追加到 for 循环内的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24200163/

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