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

问题描述 投票:0回答:3

给定一个固定长度的

char
数组,例如:

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

如何获得

&str

string char rust
3个回答
20
投票

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

String

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

问题是 Rust 中的字符串不是

char
的集合,它们是 UTF-8,这是一种每个字符没有固定大小的编码。

例如,本例中的数组需要 5 x 32 位,总共 20 个字节。字符串的数据总共需要 5 个字节(尽管还有 3 个指针大小的值,因此在这种情况下总体

String
需要更多内存)。


我们从数组开始并调用

[]::iter
,这会产生
&char
类型的值。然后我们使用
Iterator::collect
Iterator<Item = &char>
 转换为 
String
。这使用迭代器的 
size_hint
 
String
 中预分配空间,减少额外分配的需要。


6
投票
我在上面没有看到的另一条简短的台词:

let whatever_char_array = ['h', 'e', 'l', 'l', 'o']; let string_from_char_array = String::from_iter(whatever_char_array);
注意:
最近引入了此功能(迭代

array

)。我尝试寻找确切的 rustc 版本,但找不到......


0
投票
rust 中的字符串不是存储为

char

 值的序列,而是存储为 UTF-8。

因此,要将“字符”数组转换为 &str(字符串切片),您必须复制数据。正如其他答案中提到的,一种选择是使用字符串,但这意味着您可能希望避免堆分配。

如果您想避免堆分配,另一种方法是使用固定大小的数组作为结果缓冲区。在 UTF-8 中,每个字符最多占用 4 个字节,因此我们可以调整数组大小,使其不会因任何字符组合而溢出。

let mut buf = [0u8; 20]; let mut p = 0; for c in s { p += c.encode_utf8(&mut buf[p..]).len(); } let result = unsafe { std::str::from_utf8_unchecked(&buf[..p]) };
    
© www.soinside.com 2019 - 2024. All rights reserved.