我正在尝试编写一个通用的命令行解析器。我在使用泛型类型的“默认”值时遇到麻烦。 cmd.invoke()返回一个Result<K, E>,所以那里没有问题,但是当Ecmd_to_invoke时,如何表示None的占位符或默认值?在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和流行的包装箱中的大多数错误类型均未实现Default

在Rust中处理多种错误类型的惯用方式是为应用程序,库或组件定义自己的错误enum,该错误From为每种可能的基础错误类型实现?。通常,这使代码更简单易读,并且可以与E运算符一起很好地工作。 Here is an example

如果您正在编写一个实际上必须能够处理任何错误类型的库,则此方法将不起作用。在这种情况下,您可能需要将std::error::Error约束为ojit_code特征,然后创建可以从中转换的自定义错误类型,并可能保留对作为特征对象的基础错误的引用。

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

10-10 20:05