给定一个固定长度的char
数组,例如:
let s: [char; 5] = ['h', 'e', 'l', 'l', 'o'];
如何获得&str
?
答案 0 :(得分:5)
你不能没有一些分配,这意味着你最终会得到一个String
。
let s2: String = s.iter().collect();
问题是Rust中的字符串是而不是 char
s的集合,它们是UTF-8,这是一种没有每个字符固定大小的编码。
例如,在这种情况下,数组将占用5 x 32位,总共20个字节。字符串的数据总共需要5个字节(尽管还有3个指针大小的值,因此在这种情况下整体String
会占用更多内存)。
我们从数组开始并调用[]::iter
,它产生类型为&char
的值。然后,我们使用Iterator::collect
到convert the Iterator<Item = &char>
into a String
。这使用迭代器的size_hint
到pre-allocate space in the String
,减少了额外分配的需要。
答案 1 :(得分:0)
我会给你一个非常简单的功能解决方案,但它不是最好的解决方案。您可以学习一些基础知识:
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
添加元素(String
s)。然后我们通过参考for
数组在s
数组上进行itertools.groupby
循环。我们将每个元素添加到初始字符串中。最后,您可以返回字符串或只打印它。
答案 2 :(得分:0)
我在上面没有看到的另一个快速单线:
let whatever_char_array = ['h', 'e', 'l', 'l', 'o'];
let string_from_char_array = String::from_iter(whatever_char_array);
注意:
最近引入了此功能(迭代 array
)。我试图寻找确切的 rustc 版本,但找不到...