当我需要一个字符串时,有什么方法可以避免调用.to_string()吗?例如:
.to_string()
fn func1(aaa: String) -> ....
而不是
func1("fdsfdsfd".to_string())
我可以这样做:
func1(s"fdsfdsfd")
vjhs03f71#
靶病变;DR:从Rust 1.9开始,str::to_string,str::to_owned,String::from,str::into都具有相同的性能特征。使用您喜欢的任何一个。将字符串切片(&str)转换为自有字符串(String)的最明显和惯用的方法是使用ToString::to_string。这适用于任何实现Display的类型。这包括字符串切片,但也包括整数,IP地址,路径,错误等。在Rust 1.9之前,to_string的str实现利用了格式化基础设施。虽然它可以工作,但它是矫枉过正的,并且不是最高性能的路径。一个更简单的解决方案是使用ToOwned::to_owned,它是为具有“借用”和“拥有”对的类型实现的。它以一种高效的方式实现。另一个轻量级的解决方案是使用Into::into,它利用了From::from。这也是有效实现的。对于您的 * 特定 * 情况,最好的做法是接受&str,作为thirtythreeforty answered。然后您需要执行零分配,这是最好的结果。一般来说,如果我需要创建一个分配的字符串,我可能会使用into-它只有4个字母长^_^。在回答Stack Overflow的问题时,我会使用to_owned,因为它更明显。
str::to_string
str::to_owned
String::from
str::into
&str
String
ToString::to_string
Display
to_string
str
ToOwned::to_owned
Into::into
From::from
into
to_owned
nx7onnlm2#
不,str::to_string()方法是从&'static str(字符串文字)创建String的规范方法。我甚至喜欢它,因为你不喜欢它:它有点冗长。因为它涉及到堆分配,所以在这种情况下调用它之前应该三思而后行。还要注意,由于Rust gained impl specialization,str::to_string并不比str::to_owned或其同类慢。然而,你真正想要的是一个func1,它可以很容易地传递任何字符串,无论是&str还是String。因为String将Deref传递给&str,所以你可以让func1接受&str,从而完全避免String分配。参见这个例子(playground):
str::to_string()
&'static str
func1
fn func1(s: &str) { println!("{}", s); } fn main() { let allocated_string: String = "owned string".to_string(); func1("static string"); func1(&allocated_string); }
ljsrvy3e3#
dtolnay:我现在强烈推荐to_owned()作为字符串文字,而不是to_string()或into()。String和&str之间有什么区别?一个令人不满意的答案是“一个是字符串,另一个不是字符串”,因为显然两者都是字符串。使用to_string()将字符串转换为字符串似乎忽略了我们首先为什么要这样做的重点,更重要的是错过了向我们的读者记录这些的机会。String和&str的区别在于一个是owned,一个不是owned。使用to_owned()完全捕获了在我们的代码中的特定位置需要转换的原因。
to_owned()
to_string()
into()
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,则不会
to_String
3条答案
按热度按时间vjhs03f71#
靶病变;DR:
从Rust 1.9开始,
str::to_string
,str::to_owned
,String::from
,str::into
都具有相同的性能特征。使用您喜欢的任何一个。将字符串切片(
&str
)转换为自有字符串(String
)的最明显和惯用的方法是使用ToString::to_string
。这适用于任何实现Display
的类型。这包括字符串切片,但也包括整数,IP地址,路径,错误等。在Rust 1.9之前,
to_string
的str
实现利用了格式化基础设施。虽然它可以工作,但它是矫枉过正的,并且不是最高性能的路径。一个更简单的解决方案是使用
ToOwned::to_owned
,它是为具有“借用”和“拥有”对的类型实现的。它以一种高效的方式实现。另一个轻量级的解决方案是使用
Into::into
,它利用了From::from
。这也是有效实现的。对于您的 * 特定 * 情况,最好的做法是接受
&str
,作为thirtythreeforty answered。然后您需要执行零分配,这是最好的结果。一般来说,如果我需要创建一个分配的字符串,我可能会使用
into
-它只有4个字母长^_^。在回答Stack Overflow的问题时,我会使用to_owned
,因为它更明显。nx7onnlm2#
不,
str::to_string()
方法是从&'static str
(字符串文字)创建String
的规范方法。我甚至喜欢它,因为你不喜欢它:它有点冗长。因为它涉及到堆分配,所以在这种情况下调用它之前应该三思而后行。还要注意,由于Rust gained impl specialization,str::to_string
并不比str::to_owned
或其同类慢。然而,你真正想要的是一个
func1
,它可以很容易地传递任何字符串,无论是&str
还是String
。因为String
将Deref传递给&str
,所以你可以让func1
接受&str
,从而完全避免String分配。参见这个例子(playground):ljsrvy3e3#
dtolnay:
我现在强烈推荐
to_owned()
作为字符串文字,而不是to_string()
或into()
。String
和&str
之间有什么区别?一个令人不满意的答案是“一个是字符串,另一个不是字符串”,因为显然两者都是字符串。使用to_string()
将字符串转换为字符串似乎忽略了我们首先为什么要这样做的重点,更重要的是错过了向我们的读者记录这些的机会。String和&str的区别在于一个是owned,一个不是owned。使用
to_owned()
完全捕获了在我们的代码中的特定位置需要转换的原因。vitalyd:
如果您在心里将
to_string
读作to_String
,则不会