String::from("")
和 "".to_string()
在 Rust 中有什么区别?
两者在栈和堆分配方面是否有任何区别?
String::from("")
和 "".to_string()
在 Rust 中有什么区别?
两者在栈和堆分配方面是否有任何区别?
String::from("")
和"".to_string()
在Rust中有什么区别?
它们属于不同的协议(traits):std::convert::From 和 alloc::string::ToString[0]。
然而,对于&str
/String
来说,它们做相同的事情("".to_owned()
也是如此)。
这两种方式在堆和栈分配方面有什么区别吗?
正如joelb的链接所示,在Rust 1.9之前,"".to_string()
明显比其他替代方式慢,因为它要经过整个字符串格式化机制。但现在情况已经不同了。
[1] 从功能上讲,s.to_string()
等价于format!("{}", s)
,通常建议不要直接实现ToString
,除非绕过格式化机制可以显著提高性能(这就是为什么str
/String
这样做的原因)
ToString
对于 Display
是自动实现的,将一个字符串显示为其本身是合理的,所以你会得到一个与原始字符串内容相同的 String
。From
将 A 转换为 B,将 &str
转换为 String
也是合理的分配方式。ToOwned
也是一样,&str
的拥有版本就是具有相同内容的 String
。也许核心团队本可以省略 String::from(&str)
,但是...为什么要这样呢? - Masklinn.to_string()
只能用于 &str
,而 String::from()
可以从任何具有适当特性的类型生成字符串? - Pioneer_11to_string
适用于实现了 Display
特性的任何类型(或者 ToString
,但这很少直接实现),而 String::from
适用于实现了 From<Type> for String
的任何类型。 - Masklinn