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

时间:2020-01-28 18:30:53

标签: 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);
}

是否有更易读的方法?这项任务如此简单,令我惊讶的是没有快捷方法。

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

1 个答案:

答案 0 :(得分:3)

我会使用String::replace_range

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

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

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

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);
    }
}

这是一个非常简单的任务,令我惊讶的是没有快捷方式。

老实说,我认为我从没做过 ,在我从事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"));
}

另请参阅: