在Rust中,String::from("")和"".to_string()有何不同?

8

String::from("")"".to_string() 在 Rust 中有什么区别?

两者在栈和堆分配方面是否有任何区别?


2
这个回答解决了你的问题吗?如何直接创建一个字符串? - joel
1个回答

12

String::from("")"".to_string()在Rust中有什么区别?

它们属于不同的协议(traits):std::convert::Fromalloc::string::ToString[0]

然而,对于&str/String来说,它们做相同的事情("".to_owned()也是如此)。

这两种方式在堆和栈分配方面有什么区别吗?

正如joelb的链接所示,在Rust 1.9之前,"".to_string()明显比其他替代方式慢,因为它要经过整个字符串格式化机制。但现在情况已经不同了。


[0] 如果结构体实现了`Display`,也会自动实现`ToString`[1]

[1] 从功能上讲,s.to_string()等价于format!("{}", s),通常建议不要直接实现ToString,除非绕过格式化机制可以显著提高性能(这就是为什么str/String这样做的原因)


如果它们做同样的事情并且表现相同,为什么要使用不同的特点? - Pioneer_11
因为这些特性有不同的目的,它们碰巧对字符串执行相同的操作。ToString 对于 Display 是自动实现的,将一个字符串显示为其本身是合理的,所以你会得到一个与原始字符串内容相同的 StringFrom 将 A 转换为 B,将 &str 转换为 String 也是合理的分配方式。ToOwned 也是一样,&str 的拥有版本就是具有相同内容的 String。也许核心团队本可以省略 String::from(&str),但是...为什么要这样呢? - Masklinn
所以 .to_string() 只能用于 &str,而 String::from() 可以从任何具有适当特性的类型生成字符串? - Pioneer_11
不,它们都适用于实现了相应特性的任何类型。to_string 适用于实现了 Display 特性的任何类型(或者 ToString,但这很少直接实现),而 String::from 适用于实现了 From<Type> for String 的任何类型。 - Masklinn
那么,在这种情况下,这两个特征的功能有什么区别呢? - Pioneer_11

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接