gpt4 book ai didi

generics - Rust 中的通用占位符或默认值

转载 作者:行者123 更新时间:2023-11-29 07:47:38 26 4
gpt4 key购买 nike

我正在尝试编写通用命令行解析器。我在处理泛型类型的“默认”值时遇到了问题。 cmd.invoke()返回 Result<K, E> ,所以那里没有问题,但是我如何表示 E 的占位符或默认值?什么时候cmd_to_invokeNone ?在 C# 中,我可以使用 default(E) . Rust 中有这样的构造吗?

pub struct Cmd<K, E> {
cmds: Vec<Cmd<K, E>>,
}

impl<K, E> Cmd<K, E> {
pub fn invoke(&mut self, cmd_name: &str) -> Result<K, E> {
let cmd_to_invoke = self.cmds.iter_mut().find(|cmd| cmd.name == cmd_name);
if let Some(cmd) = cmd_to_invoke {
cmd.invoke()
} else {
// Some default / placeholder value for E
Err(/* ? */)
}
}
}

最佳答案

您可能正在寻找 Default .

例如:

pub struct Cmd<K, E> {}

impl<K, E: Default> Cmd<K, E> {
pub fn invoke(&mut self, cmd_name: &str) -> Result<K, E> {
let cmd_to_invoke = self.cmds.iter_mut().find(|cmd| cmd.name == cmd_name);
if let Some(cmd) = cmd_to_invoke {
cmd.invoke()
} else {
// Some default / placeholder value for E
Err(Default::default())
}
}
}

值得注意的是,std 和流行的 crate 中的大多数错误类型都没有实现 Default

在 Rust 中处理多种错误类型的惯用方法是为您的应用程序、库或组件定义您自己的错误 enum,它为每个可能的底层实现 From错误类型。这通常使代码更简单、更易于阅读,并且与 ? 运算符一起工作得很好。 Here is an example .

如果您正在编写一个确实必须处理任何 错误类型的库,那么这将不起作用。在这种情况下,您可能只剩下将 E 约束到 std::error::Error 特征,然后制作一个可以从中转换的自定义错误类型,可能保持对底层错误的引用作为特征对象。

关于generics - Rust 中的通用占位符或默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46416960/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com