.to_string()
当我需要一个字符串时,有什么方法可以避免调用吗?例如:
fn func1(aaa: String) -> ....
Run Code Online (Sandbox Code Playgroud)
而不是
func1("fdsfdsfd".to_string())
Run Code Online (Sandbox Code Playgroud)
我可以这样做:
func1(s"fdsfdsfd")
Run Code Online (Sandbox Code Playgroud)
Geo*_*ard 12
不,该str::to_string()
方法是String
从&'static str
(字符串文字)创建a的规范方法.我甚至喜欢它,因为你不喜欢它:它有点冗长.因为它涉及堆分配,所以在调用它们之前应该三思而后行.另请注意,由于Rust获得了impl专业化,str::to_string
因此不会慢于str::to_owned
或类似.
但是,你真正想要的是一个func1
可以很容易地传递任何字符串,无论是a &str
还是a String
.因为String
将DEREF的&str
,你可以func1
接受的&str
,从而完全避免了串分配.看这个例子(playground):
fn func1(s: &str) {
println!("{}", s);
}
fn main() {
let allocated_string: String = "owned string".to_string();
func1("static string");
func1(&allocated_string);
}
Run Code Online (Sandbox Code Playgroud)
She*_*ter 11
TL; DR:
由于锈1.9,str::to_string
,str::to_owned
,String::from
,str::into
都具有相同的性能特点.使用您喜欢的任何一种.
将字符串slice(&str
)转换为拥有的字符串(String
)的最明显和惯用的方法是使用ToString::to_string
.这适用于任何实现的类型Display
.这包括字符串切片,还包括整数,IP地址,路径,错误等.
在Rust 1.9之前,str
实现了to_string
利用格式化基础结构.虽然它有效,但它是过度杀伤而不是最高效的路径.
使用较轻的解决方案ToOwned::to_owned
,该解决方案适用于具有"借用"和"拥有"对的类型.它以有效的方式实施.
另一个轻量级解决方案是使用Into::into
哪种杠杆From::from
.这也有效地实施.
对于你的具体情况,最好的办法是接受一个&str
,因为三十三个人回答.然后你需要做零分配,这是最好的结果.
一般情况下,我可能会使用,into
如果我需要创建一个分配的字符串 - 它只有4个字母长^ _ ^.在回答有关Stack Overflow的问题时,我会使用to_owned
它,因为它更加明显地发生了什么.
\n\n我现在强烈喜欢
\nto_owned()
字符串文字而不是to_string()
orinto()
。\n
String
和 和有什么区别&str
?一个不令人满意的答案是 \xe2\x80\x9cone 是一个字符串,另一个不是字符串\xe2\x80\x9d,因为显然两者都是字符串。使用字符串并将其转换为字符串to_string()
似乎忽略了我们首先这样做的原因,更重要的是错过了向读者记录这一点的机会。String 和 &str 的区别在于,一种是拥有的,一种是不拥有的。使用
\nto_owned()
完全捕获了代码中特定位置需要转换的原因。Run Code Online (Sandbox Code Playgroud)\nstruct Wrapper {\n s: String\n}\n \n// I have a string and I need a string. Why am I doing this again?\nWrapper { s: "s".to_string() }\n \n// I have a borrowed string but I need it to be owned.\nWrapper { s: "s".to_owned() }\n
维塔利德:
\n\n\n如果你在心里读到
\nto_string
的话就不会to_String
归档时间: |
|
查看次数: |
709 次 |
最近记录: |