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() }