我发现了两种不同的实现方式;但是作为代码阅读器,他们都没有清楚地描述我们想要做什么(只是设置字符串内容);我本来希望像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);
}
是否有更易读的方法?这项任务如此简单,令我惊讶的是没有快捷方法。
我的目标是保持尽可能高的效率。我想尽可能保留实际容量,将新的字符串内容复制到现有的已分配区域中,并更新字符串大小。
答案 0 :(得分:3)
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"));
}
另请参阅: