这三种在Rust中声明字符串的方法有什么区别?

use*_*ser 9 string rust

let hello1 = "Hello, world!";
let hello2 = "Hello, world!".to_string();
let hello3 = String::from("Hello, world!");
Run Code Online (Sandbox Code Playgroud)

She*_*ter 12

let hello1 = "Hello, world!";
Run Code Online (Sandbox Code Playgroud)

这会创建一个字符串slice(&str).具体来说,a &'static str,一个在整个程序期间存在的字符串切片.没有分配堆内存; 字符串的数据存在于程序本身的二进制文件中.

let hello2 = "Hello, world!".to_string();
Run Code Online (Sandbox Code Playgroud)

这使用格式化机制来格式化任何实现的类型Display,创建一个拥有的,已分配的字符串(String).在1.9.0之前的Rust版本中(特别是因为这个提交),这比直接使用转换要慢String::from.在1.9.0及更高版本中,调用.to_string()字符串文字与速度相同String::from.

let hello3 = String::from("Hello, world!");
Run Code Online (Sandbox Code Playgroud)

这会String以有效的方式将字符串切片转换为拥有的,已分配的字符串().

let hello4 = "hello, world!".to_owned();
Run Code Online (Sandbox Code Playgroud)

同样的String::from.

也可以看看:

  • 感谢您在回答中付出的努力,Shepmaster。对于像我一样来到这里想知道 `.into()` 适合所有这些的人来说,[如何直接创建字符串?](/sf/ask/2193194951/ 155423)链接在此答案中。 (4认同)
  • 现在我们知道它们都具有相同的性能,Rust 社区中有选择的吗? (2认同)
  • @DrumM 每个都有自己的用处。`ToString`、`Into` / `From` 和 `ToOwned` 特征都意味着不同的*概念*事物,只是碰巧它们都对字符串执行相同的具体操作。我个人的偏好是使用 `"stringliteral".into()` 如果可行的话,否则使用 `String::from("stringliteral")`。在其他情况下,我将更改一个函数以接受 `impl Into<String>`,这样我就不必在调用站点关心。 (2认同)
  • @ezio *`to_string()` 与 `String::from()` 相同* - 并不总是,不。不过,当用于字符串类型时,它应该是相同的。*格式化机制* — 标准库的一部分,实现“println!”或“write!”等工具的所有功能。[`std::fmt`](https://doc.rust-lang.org/stable/std/fmt/) 记录的内容 (2认同)