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
的方法。