微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在不复制的情况下将两个字符串连接到第三个字符串中?

如何解决如何在不复制的情况下将两个字符串连接到第三个字符串中?

我是 Rust 的新手,目前正在阅读 The Rust 编程语言书籍。

我对这个例子很好奇:

fn main() {
    let s1 = String::from("Hello,");
    let s2 = String::from("world!");
    let s3 = s1 + &s2; // note s1 has been moved here and can no longer be used
}

是否有可能不仅获得 s1 的所有权,还获得 s2 的所有权,所以 s2s1 一样无效,使得 s3唯一可能仍然可用的变量?

解决方法

更新答案

这是不可能的。 String 必须是内存中的单个连续分配。如果你想推出自己的简单解决方案,你可以定义一个这样的类型:

struct MyString {
    parts: Vec<String>,}

impl MyString {
    fn concat(&mut self,other: String) {
        self.parts.push(other);
    }
}

然而,为这个自定义类型重新实现每一个有用的 String 方法将是乏味和容易出错的。您可以找到实现 Rope data structure 的 Rust crate,而 an-rope 似乎就是这样的 crate,但仅支持一小部分 String 方法。


当我将 OP 的问题解释为关于使变量无效和移动的问题时,我给出了这个答案:

原答案

您可以通过将任何非 Copy 变量移动到其他地方来使其无效,例如将其传递给 drop 函数:

fn main() {
    let s1 = String::from("Hello,");
    let s2 = String::from("world!");
    let s3 = s1 + &s2; // s1 invalidated
    drop(s2); // s2 invalidated
    // now only s3 is usable
}

如果这是您的应用程序中的常见模式,您只需编写一个函数,该函数获取 2 个 String 的所有权并返回连接的结果:

fn concat(s1: String,s2: String) -> String {
    s1 + &s2
}

fn main() {
    let s1 = String::from("Hello,");
    let s2 = String::from("world!");
    let s3 = concat(s1,s2); // s1 & s2 invalidated
    // now only s3 is usable
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。