给定一个固定长度的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 版本,但无法...
我会给你一个非常简单的功能解决方案,但它不是最好的。您可以学习一些基础知识:
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
循环。我们将每个元素添加到初始字符串中。最后,您可以返回字符串或只是打印它。