gpt4 book ai didi

string - 如何在创建后替换 String 变量的内容?

转载 作者:行者123 更新时间:2023-12-03 11:33:16 25 4
gpt4 key购买 nike

我找到了两种不同的方法;但是作为代码阅读者,他们都没有明确描述我们要做什么(简单地设置字符串内容);我会期待类似 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);
}

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

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

最佳答案

我会使用 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);
}
}

It is such a straightforward task that I'm surprised there is no shortcut method for it.

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

另见:

关于string - 如何在创建后替换 String 变量的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59954974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com