在Rust中初始化字符串数组

use*_*500 6 arrays rust

我想创建一个固定大小的可变数组.元素在程序中稍后初始化.如何初始化阵列?

我试过这样做:

let mut array: [String; 126] = [String::new(); 126];
Run Code Online (Sandbox Code Playgroud)

它给了我错误:

the trait bound 'std::string::String: std::marker::Copy' is not satisfied
the trait 'std::marker::Copy' is not implemented for 'std::string::String'
Run Code Online (Sandbox Code Playgroud)

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

E_n*_*ate 7

目前,使用大型固定大小的阵列几乎没有什么好处.它们没有实现与其他序列类型一样多的特征.

特别是,在Default这里有用,但它只适用于最多32的数组:

let array: [String; 32] = Default::default();
Run Code Online (Sandbox Code Playgroud)

任何数字都将无法编译,因为目前,Rust在数组大小方面并不通用,而且这32个实现Default都是手动添加的.

我们可以通过替代容器类型克服这一点,例如Vec:

let mut array: Vec<String> = vec![String::new(); 126];
Run Code Online (Sandbox Code Playgroud)

但是,当然,根据您的使用情况,您可能还会考虑使用惰性API并仅使用Iterator API收集最终结果.


jil*_*les 6

有些方法适用于类型,但无需const构造它们,例如:

let mut a = [(); 126].map(|_| String::new());
Run Code Online (Sandbox Code Playgroud)

对于这种特殊情况,另一个答案const EMPTY_STRING: String = String::new()可能更好,因为该array::map方法的文档警告这可能效率低下并且消耗大量堆栈空间。

在 nightly 中(从 Rust 1.57 开始),还有一个更好的函数std::array::from_fn()