创建字符串变量后如何替换它的内容?

yol*_*yer 4 string rust

我找到了两种不同的方法;但作为代码阅读器,它们都没有清楚地描述我们想要做什么(简单地设置字符串内容);我本来期望的是这样的s.set("hello")

fn main() {
    let mut s = String::from("hi");
    s.clear();
    s.push_str("hello");
    println!("{}", s);

    let mut s = String::from("hi");
    s.replace_range(.., "hello");
    println!("{}", s);
}
Run Code Online (Sandbox Code Playgroud)

有没有更易读的方法来做到这一点?这是一项如此简单的任务,令我惊讶的是没有捷径可走。

我的目标是尽可能保持效率。如果可能的话,我想保留实际容量,将新的字符串内容复制到现有的分配区域并更新字符串大小。

She*_*ter 11

我会用String::replace_range

fn main() {
    let mut s: String = String::from("alpha");
    println!("{}", s);

    s.replace_range(.., "beta");
    println!("{}", s);
}
Run Code Online (Sandbox Code Playgroud)

如果你真的不喜欢这个,你可以创建一个扩展特征

fn main() {
    let mut s: String = String::from("alpha");
    println!("{}", s);

    s.set("beta");
    println!("{}", s);
}

trait StringSetExt {
    fn set(&mut self, s: &str);
}

impl StringSetExt for String {
    fn set(&mut self, s: &str) {
        self.replace_range(.., s);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一项如此简单的任务,令我惊讶的是没有捷径可走。

老实说,在我从事 Rust 的 5 年里,我从未见过有人愿意这样做,而且我认为从性能的角度来看,这是不值得的。

相反,我认为调用者更有可能已经分配了一些他们不关心的内存。在这种情况下,我会接受他们的字符串:

struct Person(String);

impl Person {
    fn set_name(&mut self, s: impl Into<String>) {
        self.0 = s.into();
    }
}

fn main() {
    let mut p = Person(String::new());
    p.set_name("alpha");
    p.set_name(String::from("beta"));
}
Run Code Online (Sandbox Code Playgroud)

也可以看看: