如何从字符数组 [字符;N] 到字符串切片 &str?



给定一个固定长度的char数组,例如:

let s: [char; 5] = ['h', 'e', 'l', 'l', 'o'];

如何获得&str

你不能

没有一些分配,这意味着你最终会得到一个String

let s2: String = s.iter().collect();

问题是 Rust 中的字符串不是 char 的集合,它们是 UTF-8,这是一种没有固定大小的编码。

例如,在这种情况下,数组将采用 5 x 32 位,总共 20 个字节。字符串的数据总共需要 5 个字节(尽管也有 3 个指针大小的值,因此在这种情况下,整体String会占用更多内存)。


我们从数组开始并调用 []::iter ,它产生 &char 类型的值。然后我们使用Iterator::collectIterator<Item = &char>转换为String。这使用迭代器的size_hintString中预先分配空间,减少了额外分配的需要。

我在上面没有看到的另一个快速的单行:

let whatever_char_array = ['h', 'e', 'l', 'l', 'o'];
let string_from_char_array = String::from_iter(whatever_char_array);

注意:此功能(迭代array)是最近引入的。我尝试寻找确切的 rustc 版本,但无法...

我会给你一个非常简单的功能解决方案,但它不是最好的。您可以学习一些基础知识:

let s: [char; 5] = ['h', 'e', 'l', 'l', 'o'];
let mut str = String::from("");
for x in &s {
    str.push(*x);
}
println!("{}", str);

如果要保留签名,可以在变量名称之前添加下划线,但在这个简单的示例中,这不是必需的。程序首先创建一个空的可变String,以便您可以将元素(char s)添加到String。然后,我们通过获取s数组的引用来对数组进行for循环。我们将每个元素添加到初始字符串中。最后,您可以返回字符串或只是打印它。

最新更新