假设有一个固定长度的char
数组,如下:
let s: [char; 5] = ['h', 'e', 'l', 'l', 'o'];
我如何获得一个&str
?
如果没有分配内存,你将无法进行操作,这意味着你最终会得到一个 String
。
let s2: String = s.iter().collect();
char
的集合,它们是 UTF-8 编码,每个字符没有固定的大小。String
会占用更多的内存)。
[]::iter
,它会产生类型为&char
的值。然后我们使用Iterator::collect
来将Iterator<Item = &char>
转换为String
。这使用迭代器的size_hint
来预先分配String
中的空间, 减少额外分配的需求。vec!
宏的 String
等效物? - RufflewindString::from("foo")
还是 "foo".to_string()
?在某些上下文中,您还可以使用 "foo".into()
。您实际上不需要宏来进行任何操作; 那些只是函数调用。我想你可以创建一个名为s
的方法,如果它们太长,就调用其中之一... - Shepmasterstr!['h', 'e', 'y']
。 - Rufflewind[c1, c2, c3]
。 - Rufflewind这是一个我之前没有看到的快速一行代码:
let whatever_char_array = ['h', 'e', 'l', 'l', 'o'];
let string_from_char_array = String::from_iter(whatever_char_array);
array
)是最近引入的。我试图寻找确切的rustc版本,但没有找到...std::array :: IntoIter
在1.51中引入,而impl <T,const N:usize> IntoIterator for [T; N]
在1.53中引入 - Dinu我会给你一个非常简单的功能性解决方案,但这不是最好的。你可以学习一些基础知识:
let s: [char; 5] = ['h', 'e', 'l', 'l', 'o'];
let mut str = String::from("");
for x in &s {
str.push(*x);
}
println!("{}", str);
在变量名前面,如果您想保留签名,可以加下划线,但在这个简单的例子中并不必要。程序首先创建一个空的可变String
,以便您可以向String
添加元素(char
)。然后我们通过获取其引用对s
数组进行for
循环。我们将每个元素添加到初始字符串中。最后,您可以返回您的字符串或只是打印它。
: [char; 5]
是多余的,类型可以被推导。 - Shepmaster"hello"
会更加简单和实用。 - user395760[c1, c2, c3]
。 - Rufflewind