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

时间:2016-07-13 18:28:36

标签: string char rust

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

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

如何获得&str

3 个答案:

答案 0 :(得分:5)

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

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

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

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

我们从数组开始并调用[]::iter,它产生类型为&char的值。然后,我们使用Iterator::collectconvert the Iterator<Item = &char> into a String。这使用迭代器的size_hintpre-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 版本,但找不到...