如果您是探索Rust语言的Python开发人员,您会发现使用Rust的字符串与Python完全不同。 Rust有两种主要类型代表字符串:String
和str
。
让我们深入了解它们的本质以及它们的不同。
什么是String
和str
?
String
是一种可生长的,堆积的数据结构,可让您存储一系列UTF-8字符。这类似于python的str
类型,但是有一个关键区别 - 生锈中的String
是可变的,可以修改(Rust Doc: String)。
另一方面,str
(发音为“字符串slice')是不可变的引用或“视图”到字符串中。它可以指向整个字符串或一个小节(Rust Doc: str)。
您最常见的是以其借来的形式遇到str
,以&str
表示。
为什么生锈有两种字符串类型?
生锈的两种字符串类型适合不同的用例。
String
当您需要拥有字符串并更改其内容时,使用了
String
,例如附加字符或在某个位置更改字符。
str
用于更多“仅读取”操作。由于它是一个不变的参考,因此它不拥有基础内存,也无法改变它。
这与python不同,在那里您习惯于使用一种主要的字符串类型(str
),这总是不变的。
例子
让我们看一个示例:
fn main() {
let mut s = String::from("hello");
s.push_str(", world"); // This works fine
println!("{}", s);
}
在此Rust程序中,我们创建了一个String
,然后使用push_str
方法将其附加到它上,鉴于Python中的字符串是不可变的,Python开发人员可能会惊讶地看到。
现在,让我们看看当我们尝试修改(更改特定字符)str
:
时会发生什么
fn main() {
let mut s = "hello";
s[0] = 'H'; // This will cause an error
println!("{}", s);
}
在此Rust程序中,我们正在尝试用“ H”替换str
的第一个字符。如果s
是可变的String
,我们可以使用replace_range
方法来做到这一点。但是由于s
是str
,我们无法更改其内容,并且由于str
是不变的,因此该程序不会编译。
我们是试图附加到字符串还是更改特定字符都没关系 - str
也不允许。
如果我们想将字符附加到字符串中,则首先必须将其转换为带有s.to_string()
的字符串。然后,我们可以使用push
方法将字符附加到String
。
例如:
fn main() {
let s = "hello";
let mut t = s.to_string(); // Convert to String to allow changes
t.push('!'); // Append a character to the string
println!("{}", t);
}
此程序将编译并打印“ Hello!”。
结论
String
和str
具有不同的目的。当您需要拥有和修改字符串数据时,请使用String
,并在需要临时读取的视图中使用str
。
Rust字符串类型可让您对内存分配的更多控制,并有助于防止与内存访问相关的错误。这种设计选择与Rust的性能和安全性核心目标保持一致。这是Rust与Python和许多其他语言的明显不同的方式之一,这是您编写更多Rust Code时会习惯的。