我正在使用config-rs板条箱。我想在我的配置中将数组设置为默认值。我想使用板条箱中的 set_default() 方法,该方法接受 Value< Array> https://docs.rs/config/latest/config/builder/struct.ConfigBuilder.html#method.set_default类型的参数
我是 Rust 新手,对于如何快速创建向量< Value>
let default: Vec<ValueKind>= vec![1,2,3];// Errors
let default: Vec<Value>= vec![1,2,3]; // Errros
Run Code Online (Sandbox Code Playgroud)
如果您想创建一个Vec<T>,则项目必须属于类型T。Rust 不执行隐式转换,因此您需要编写更多代码才能完成此操作。它甚至不允许原始类型之间的隐式转换(例如:i32to i64)。
为此,您可以使用 来创建新的Value或。我知道这是可以做到的,因为文档指出实现了. 同样的事情也适用于,但在阅读文档时更难发现。ValueKindFromValueKindFrom<i32>Value
// Same applies to `Value`.
let default: Vec<ValueKind> = vec![ValueKind::from(1), ValueKind::from(2), ValueKind::from(3)];
Run Code Online (Sandbox Code Playgroud)
为了使这更容易,您还有一些其他选择。Into对于所有实现 的类型都会自动实现From,我们可以ValueKind::from(1)用较短的1.into()调用来替换冗长的调用。
let default: Vec<ValueKind> = vec![1.into(), 2.into(), 3.into()];
Run Code Online (Sandbox Code Playgroud)
如果您有很多值,您还可以选择使用迭代器一次性转换一组值。
let default: Vec<ValueKind> = [1, 2, 3, 4, 5, 6, 7, 8, 9]
.into_iter()
.map(|x| ValueKind::from(x))
.collect();
Run Code Online (Sandbox Code Playgroud)
话虽这么说,我有点惊讶板条箱作者没有提供按 *。Vec<i32>原样使用的选项(尽管我没有检查这方面的文档,因为我不知道它是如何使用的)Vec编写一个接受任何可迭代类型(如、数组或一堆其他东西)的通用函数并不太难,并将其转换为ValueKind或Value。
/// Takes some iterable value and turns it into a Vec<ValueKind>.
pub fn to_valuekind<A, T>(values: A) -> Vec<ValueKind>
where
A: IntoIterator<Item = T>,
ValueKind: From<T>,
{
values.into_iter().map(|x| ValueKind::from(x)).collect()
}
Run Code Online (Sandbox Code Playgroud)
*看起来这是对功能的限制set_default。它接受 any Into<Value>,但这样做它们就不能同时实现 across ,因为如果一个类型同时实现和IntoIterator,理论上可能会导致冲突。Into<Value>IntoIterator<T> where T: Into<Value>