【问题标题】:String append, cannot move out of dereference of '&'pointer字符串追加,不能移出'&'指针的取消引用
【发布时间】:2014-07-24 20:49:49
【问题描述】:

我在组合两个字符串时遇到了麻烦,我对 rust 很陌生,所以如果有更简单的方法,请随时告诉我。

我的函数循环遍历字符串元组的向量(String,String),我想要做的是能够将这两个字符串元素组合成一个字符串。这是我所拥有的:

for tup in bmp.bitmap_picture.mut_iter() {
    let &(ref x, ref y) = tup;
    let res_string = x;
    res_string.append(y.as_slice());
}

但我收到错误消息:error: cannot move out of dereference of '&'-pointer 的行:res_string.append(y.as_slice());

我也尝试了res_string.append(y.clone().as_slice());,但发生了完全相同的错误,所以我不确定这样做是否正确。

【问题讨论】:

    标签: rust


    【解决方案1】:

    append的函数定义为:

    fn append(self, second: &str) -> String
    

    普通的self 表示按值语义。按值将接收者移动到方法中,除非接收者实现 Copy(String 没有)。所以你必须克隆 x 而不是 y。

    如果要移出向量,则必须使用move_iter

    还有一些其他可能的改进:

    let string_pairs = vec![("Foo".to_string(),"Bar".to_string())];
    
    // Option 1: leave original vector intact
    let mut strings = Vec::new();
    for &(ref x, ref y) in string_pairs.iter() {
        let string = x.clone().append(y.as_slice());
        strings.push(string);
    }
    
    // Option 2: consume original vector
    let strings: Vec<String> = string_pairs.move_iter()
        .map(|(x, y)| x.append(y.as_slice()))
        .collect();
    

    【讨论】:

      【解决方案2】:

      您似乎对 append 感到困惑,它通过值获取接收器并返回自身,而 push_str 只是像您期望的那样改变接收器(通过可变引用传递)。因此,对您的示例最简单的修复是将 append 更改为 push_str。您还需要将“ref x”更改为“ref mut x”,以便对其进行变异。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-11
        • 1970-01-01
        • 1970-01-01
        • 2019-07-31
        • 2020-07-04
        • 1970-01-01
        • 2014-10-27
        • 1970-01-01
        相关资源
        最近更新 更多