rust 如何直接创建一个字符串?

fbcarpbf  于 2023-03-23  发布在  其他
关注(0)|答案(3)|浏览(186)

当我需要一个字符串时,有什么方法可以避免调用.to_string()吗?例如:

fn func1(aaa: String) -> ....

而不是

func1("fdsfdsfd".to_string())

我可以这样做:

func1(s"fdsfdsfd")
vjhs03f7

vjhs03f71#

靶病变;DR:
从Rust 1.9开始,str::to_stringstr::to_ownedString::fromstr::into都具有相同的性能特征。使用您喜欢的任何一个。
将字符串切片(&str)转换为自有字符串(String)的最明显和惯用的方法是使用ToString::to_string。这适用于任何实现Display的类型。这包括字符串切片,但也包括整数,IP地址,路径,错误等。
在Rust 1.9之前,to_stringstr实现利用了格式化基础设施。虽然它可以工作,但它是矫枉过正的,并且不是最高性能的路径。
一个更简单的解决方案是使用ToOwned::to_owned,它是为具有“借用”和“拥有”对的类型实现的。它以一种高效的方式实现。
另一个轻量级的解决方案是使用Into::into,它利用了From::from。这也是有效实现的。
对于您的 * 特定 * 情况,最好的做法是接受&str,作为thirtythreeforty answered。然后您需要执行零分配,这是最好的结果。
一般来说,如果我需要创建一个分配的字符串,我可能会使用into-它只有4个字母长^_^。在回答Stack Overflow的问题时,我会使用to_owned,因为它更明显。

nx7onnlm

nx7onnlm2#

不,str::to_string()方法是从&'static str(字符串文字)创建String的规范方法。我甚至喜欢它,因为你不喜欢它:它有点冗长。因为它涉及到堆分配,所以在这种情况下调用它之前应该三思而后行。还要注意,由于Rust gained impl specializationstr::to_string并不比str::to_owned或其同类慢。
然而,你真正想要的是一个func1,它可以很容易地传递任何字符串,无论是&str还是String。因为StringDeref传递给&str,所以你可以让func1接受&str,从而完全避免String分配。参见这个例子(playground):

fn func1(s: &str) {
    println!("{}", s);
}

fn main() {
   let allocated_string: String = "owned string".to_string();
   func1("static string");
   func1(&allocated_string);
}
ljsrvy3e

ljsrvy3e3#

dtolnay
我现在强烈推荐to_owned()作为字符串文字,而不是to_string()into()
String&str之间有什么区别?一个令人不满意的答案是“一个是字符串,另一个不是字符串”,因为显然两者都是字符串。使用to_string()将字符串转换为字符串似乎忽略了我们首先为什么要这样做的重点,更重要的是错过了向我们的读者记录这些的机会。
String和&str的区别在于一个是owned,一个不是owned。使用to_owned()完全捕获了在我们的代码中的特定位置需要转换的原因。

struct Wrapper {
    s: String
}
   
// I have a string and I need a string. Why am I doing this again?
Wrapper { s: "s".to_string() }
   
// I have a borrowed string but I need it to be owned.
Wrapper { s: "s".to_owned() }

vitalyd
如果您在心里将to_string读作to_String,则不会

相关问题