在Rust中初始化字符串数组

19

我想创建一个可变长度但元素数量固定的数组。这些元素稍后会在程序中初始化。怎么样才能初始化这个数组?

我尝试了以下方法:

let mut array: [String; 126] = [String::new(); 126];

它给了我一个错误:

the trait bound 'std::string::String: std::marker::Copy' is not satisfied
the trait 'std::marker::Copy' is not implemented for 'std::string::String'

如何使用新字符串初始化数组?

3个回答

25

目前,数组的初始化仍有一些棘手的问题。特别是,拥有Default将对此非常有用,但它仅针对32个以下的数组实现:

目前,数组的初始化仍然有些棘手。尤其是,在这里拥有Default会很有用,但它只在32个以下的数组上实现:

let array: [String; 32] = Default::default();

如果一个数组的长度超过了 Rust 1.47 中实现的一些针对泛型大小的 trait,Default 就不能再编译通过了。目前,Default 还没有实现这样的 trait。这 32 个 Default 实现是“手动添加”的。

我们可以使用其他容器类型来克服这个问题,例如 Vec。使用 vec! 宏可以让你把一个字符串克隆多次,并填充到新的向量中:

let mut array: Vec<String> = vec![String::new(); 126];

当然,根据你的使用情况,你也可以考虑采用“懒惰”的方式,仅使用迭代器API收集最终结果。


哇,如果我们想在Rust中初始化一个字符串数组,只包含红色、蓝色和绿色,那该怎么做呢? - Daniel
@Daniel 那会是一个不同的问题,但可以看相关书籍章节。https://doc.rust-lang.org/book/ch08-01-vectors.html#creating-a-new-vector - E net4

6

有一些方法适用于没有 const 的类型来构造它们,例如:

let mut a = [(); 126].map(|_| String::new());

另一个回答中使用的const EMPTY_STRING: String = String::new() 或许更适用于这种情况,因为array::map 方法的文档警告称这可能是低效的且会消耗大量栈空间。
在夜间版(Rust 1.57),也有一个更好的函数std::array::from_fn()

4
你可以使用一个常量函数(的结果)来初始化一个数组,例如 String::new()。请参考:常量函数String::new()
const EMPTY_STRING: String = String::new();
let mut array: [String; 126] = [EMPTY_STRING; 126];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接