理解锈蚀中的字符串:字符串与str
#编程 #python #rust #learning

如果您是探索Rust语言的Python开发人员,您会发现使用Rust的字符串与Python完全不同。 Rust有两种主要类型代表字符串:Stringstr

让我们深入了解它们的本质以及它们的不同。

什么是Stringstr

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方法来做到这一点。但是由于sstr,我们无法更改其内容,并且由于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!”。

结论

Stringstr具有不同的目的。当您需要拥有和修改字符串数据时,请使用String,并在需要临时读取的视图中使用str

Rust字符串类型可让您对内存分配的更多控制,并有助于防止与内存访问相关的错误。这种设计选择与Rust的性能和安全性核心目标保持一致。这是Rust与Python和许多其他语言的明显不同的方式之一,这是您编写更多Rust Code时会习惯的。

有关更多详细信息,请参阅koude0koude1的官方生锈文档。