我找到了两种不同的方法;但作为代码阅读器,它们都没有清楚地描述我们想要做什么(简单地设置字符串内容);我本来期望的是这样的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
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)
也可以看看: