给定一个固定长度的
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::collect
将 Iterator<Item = &char>
转换为
String
。这使用迭代器的 size_hint
在
String
中预分配空间,减少额外分配的需要。
let whatever_char_array = ['h', 'e', 'l', 'l', 'o'];
let string_from_char_array = String::from_iter(whatever_char_array);
注意:
最近引入了此功能(迭代array
)。我尝试寻找确切的 rustc 版本,但找不到......
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]) };