String 如何将字符数组[char;N]转换为字符串片段&;str?

String 如何将字符数组[char;N]转换为字符串片段&;str?,string,char,rust,String,Char,Rust,给定一个固定长度的char数组,例如: let s: [char; 5] = ['h', 'e', 'l', 'l', 'o']; 如何获得&str?如果没有一些分配,您将无法获得,这意味着您将得到一个字符串 let s2: String = s.iter().collect(); 问题是Rust中的字符串不是chars的集合,而是UTF-8,这是一种没有固定大小的编码 例如,在这种情况下,数组将占用5 x 32位,总共20个字节。字符串的数据总共需要5个字节(虽然也有3个指针大小的值,所以

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

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

如何获得
&str

如果没有一些分配,您将无法获得,这意味着您将得到一个
字符串

let s2: String = s.iter().collect();
问题是Rust中的字符串不是
char
s的集合,而是UTF-8,这是一种没有固定大小的编码

例如,在这种情况下,数组将占用5 x 32位,总共20个字节。字符串的数据总共需要5个字节(虽然也有3个指针大小的值,所以在这种情况下,整个
string
需要更多内存)



我们从数组和调用开始,它生成类型为
&char
的值。然后我们就习惯了。这使用迭代器的
size\u提示来减少额外分配的需要。

我将为您提供一个非常简单的函数解决方案,但它不是最好的。您可以学习一些基本知识:

let s: [char; 5] = ['h', 'e', 'l', 'l', 'o'];
let mut str = String::from("");
for x in &s {
    str.push(*x);
}
println!("{}", str);

如果希望保留签名,可以在变量名之前加下划线,但在这个简单的示例中,不需要加下划线。程序首先创建一个空的可变
字符串
,这样您就可以向
字符串
中添加元素(
char
s)。然后,通过引用
s
数组,在
s
数组上进行
for
循环。我们将每个元素添加到初始字符串中。最后,您可以返回字符串或直接打印它。

请注意,
:[char;5]
是多余的;类型是可以推断出来的。@Shepmaster:我把它放在这里是为了让问题更清楚:)你为什么要创建这样的数组<代码>“hello”
更简单、更有用。@delnan:有时我想创建一个包含编译时未知字符的代码,例如
[c1、c2、c3]
。是否有与
vec等价的代码字符串的宏”
?@Rufflewind我不确定我是否理解。你是说
String::from(“foo”)
还是
“foo.”to_String()
?在某些上下文中,您还可以使用
“foo.into()
。你不需要任何宏;这些只是函数调用。我想你可以创建一个方法
s
,如果它们太长,可以调用其中一个方法…我的意思是类似
str!['h','e','y']
@Rufflewind为什么要这样做,而不仅仅是
“嘿”
?有时我想用编译时未知的字符创建一个,例如
[c1,c2,c3]
。如果你想保留签名,可以加一个下划线-这不是在变量名中使用下划线的惯用用法。前导下划线指示编译器该变量是故意未使用的,而这里不是这种情况。
String::from(“”)-这不是创建空
字符串的惯用方法。改为使用
String::new
。此解决方案不如使用
collect
的答案有效,因为
collect
使用
extend
的方法。