Rust 如何直接创建字符串?

Rust 如何直接创建字符串?,rust,Rust,当我需要字符串时,有没有办法避免调用.to_string()?例如: fn func1(aaa: String) -> .... 而不是 func1("fdsfdsfd".to_string()) 我可以这样做吗: func1(s"fdsfdsfd") 否,str::to_string()方法是从&'static str(字符串文本)创建字符串的标准方法。我甚至喜欢它,因为你不喜欢它:它有点冗长。因为它涉及堆分配,所以在这种情况下调用它之前应该三思。还要注意的是,由于,str::to

当我需要字符串时,有没有办法避免调用
.to_string()
?例如:

fn func1(aaa: String) -> ....
而不是

func1("fdsfdsfd".to_string())
我可以这样做吗:

func1(s"fdsfdsfd")

否,
str::to_string()
方法是从
&'static str
(字符串文本)创建
字符串的标准方法。我甚至喜欢它,因为你不喜欢它:它有点冗长。因为它涉及堆分配,所以在这种情况下调用它之前应该三思。还要注意的是,由于,
str::to_string
并不比
str::to_owned
或其同类产品慢

但是,这里真正需要的是一个
func1
,它可以轻松地传递给任何字符串,无论是
&str
还是
字符串。由于
字符串
将转换为
&str
,因此可以让
func1
接受
&str
,从而完全避免字符串分配。请参见此示例():

TL;博士:

截至年月日,
str::to_string
str::to_owned
string::from
str::into
均具有相同的性能特征。用你喜欢的


将字符串片段(
&str
)转换为自有字符串(
string
)最明显、最惯用的方法是使用。这适用于实现的任何类型。这包括字符串片段,但也包括整数、IP地址、路径、错误等

在Rust 1.9之前,
str
to_string
的实现利用了。虽然它起作用了,但这是一种过激的行为,并不是最有效的途径

一个更轻的解决方案是使用,它是为具有“借用”和“拥有”对的类型实现的。是的

另一个轻量级的解决方案是使用它来利用。这也是


对于您的具体情况,最好的做法是接受
&str
,如下所示。然后您需要执行零分配,这是最好的结果

一般来说,如果我需要生成一个分配的字符串,我可能会将
转换为
,它只有4个字母长。在回答有关堆栈溢出的问题时,我将使用
来回答
,因为发生的事情要明显得多。

:

我现在非常喜欢字符串文本的
to_owned()
,而不是
to_string()
to()

String
&str
之间有什么区别?一个不令人满意的答案是“一个是字符串,另一个不是字符串”,因为显然两者都是字符串。使用
to_string()
将字符串转换为字符串似乎忽略了我们为什么首先要这样做,更重要的是,错过了向读者记录这一点的机会

String和&str之间的区别在于一个为所有,另一个为非所有。使用
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() }
:

如果你把
读入字符串
当作
读入字符串


默认情况下仍然使用
to_string
,即使技术上稍微慢一点。不过,如果有专门化,就不会这样了。根据alex crichton的说法,
to_string
是将
str
转换为
string
的惯用方法:@steveklabnik在GitHub链接上,您说过“
to_owned()
更适合通用代码。”这是为什么呢?
to_string
绝对是惯用的选择,只是目前还不是性能上的选择。大约六个月前,我将
替换为_string
使我的代码占用了以前时间的87%。Thirty340,因为这是一种将借来的价值转换为自有价值的通用方法。你是想包括vitalyd的评论吗?
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() }