Rust 附加到for循环内的字符串

Rust 附加到for循环内的字符串,rust,Rust,我试图通过在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

我试图通过在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)
):


append
的函数签名为

fn append(self, second: &str) -> String
self
是按值传递的,这意味着如果self实现了复制特性,它将被复制,否则它将被移动。字符串不实现复制,因此它将被移动

折叠操作可以将字符串固定在附录之间:

let s = format!("some string");
let s = vec!(1,2).iter()
    .fold(s, |s, num| s.append("some other string"));
println!("{}",s);

我假设你最终想要从向量中读取字符串。如果您只是想重复一个操作几次,那么应该使用
range(0,n)
std::iter::repeat::new(“其他字符串”)。将(n)
作为迭代器进行折叠。

更新:在最新版本中(从1.0.0-alpha开始)
append()
方法不再存在。但是,
String
Vec
都重载了
+
方法,其行为与旧的
append()
完全相同:

运算符总是按值获取操作数,因此这不会导致不必要的重新定位。对于
字符串
,右操作数必须是
&str
;对于
向量
,右操作数必须是
&T];在后一种情况下,
T
必须是
Clone

无论如何,
push\u 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\u str()

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


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

我会看看是否可以将代码调整为使用fold,因为这看起来比正常的for循环更整洁。谢谢。现在我将使用push_str,看看是否可以将代码转换为更具功能性的样式,以避免以后使用mut。
let mut s = "some string".to_string();
for &x in [1, 2].iter() {
    s = s.append("some other string");  // note the reassignment
}
fn append(self, other: &str) -> String { ... }
let mut s = "some string".to_string();
for &x in [1, 2].iter() {
    s.push_str("some other string");
}