如何创建字符串文本

How to create a string literal

提问人:Heineken 提问时间:11/16/2023 更新时间:11/16/2023 访问量:80

问:

你只想创建一个字符串文字,如“Hello, world!”,然后打印出来。你应该怎么做?

let str = "Hello, world!";
// or
let str = String::from("Hello, world!");
// or
let str = "Hello, world!".to_owned();
// or
let str = "Hello, world!".to_string();

有什么区别?

字符串 性能 生锈

评论

0赞 Ivan C 11/16/2023
stackoverflow.com/questions/24158114/ 的副本...
0赞 Eugene Sh. 11/16/2023
str在任何这些情况下都不是字符串文本。 是。参考: doc.rust-lang.org/beta/reference/tokens.html#string-literals"Hello, world!"
0赞 Heineken 11/16/2023
@EugeneSh。不知道你的意思,但在这个例子中,“str”只是变量的名称。
1赞 Colonel Thirty Two 11/16/2023
@Heineken是一个变量。通过代码形成的对象是字符串文字。第一个示例是存储对文本的引用。由于它们是与代码绑定的对象,因此询问“如何创建”代码是非常奇怪的,并且是 XY 问题的症状。str"Hello, world!"str
1赞 Chayim Friedman 11/16/2023
第一个是 .所有其他三种都是转换为 .&str&strString

答:

2赞 Schwern 11/16/2023 #1

你只想创建一个字符串文字,如“Hello, world!”,然后打印出来。你应该怎么做?

println!("Hello, world!");

甚至不需要变量。

"Hello, world!"是作为 Rust 二进制文件的一部分存储的字符串文字。它是不可变的。它与 和 类型不同。strString

让我们看一下你的四行代码。

let s = "Hello, world!";

s包含一个 str,又名“字符串切片”,使用字符串文字初始化。它是 Rust 中内置的原始类型。这基本上是指向 in 和长度的指针。由于它指向不可变的字符串文本,因此无法更改字符串。它只能更改其起点和长度。H"Hello, world!"s

例如,修剪通过移动起始指针和长度来工作。字符串文本保持不变。

// s points at the first "\t" and has a length of 9.
let s = "\t\nHello\t\n";

// trimmed points at "H" and has a length of 5.
let trimmed = s.trim()

println!(s) // "\t\nHello\t\n"
println!(trimmed) // "Hello"

// Both s and trimmed point at the same string literal.
// "\t\nHello\t\n"
//  ^   ^
//  |   t----
//  s------------

let s = String::from("Hello, world!");

s包含使用字符串文本初始化的 String。这是一个结构,它有自己的内存,用于字符串文字的副本。这允许您对内容进行更改;您正在更改副本。

let s = "Hello, world!".to_owned();

s包含一个 .to_owned用于从借用的数据创建拥有的数据,通常是通过克隆它。它适用于任何具有 ToOwned 特征的东西。String

当对字符串文本 (str) 调用时,它返回一个 String。

let s = "Hello, world!".to_string();

s包含一个 . 是 ToString 特征的一部分。它将值转换为 String。在引擎盖下,它可能相当于.Stringto_stringString::from

评论

0赞 cafce25 11/16/2023
最后一个 pararaph 把它倒过来了,ToString 的一揽子实现是用来实现自己的,而不是相反。Display
0赞 Schwern 11/16/2023
@cafce25 谢谢,我就跳过它。