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

时间:2017-09-26 02:32:59

标签: generics error-handling rust default

我正在尝试编写通用命令行解析器。我在&#34;默认&#34;泛型类型的值。 cmd.invoke()会返回Result<K, E>,因此没有问题,但当E为{{1}时,如何为cmd_to_invoke代表占位符或默认值}}?在C#中,我可以使用None。 Rust中有这样的构造吗?

default(E)

1 个答案:

答案 0 :(得分:10)

您可能正在寻找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。这通常使代码更简单,更易于阅读,并且与?运算符非常吻合。 Here is an example

如果您正在编写一个真正必须使用任何错误类型的库,那么这将无法正常工作。在这种情况下,您可能会将E约束到std::error::Error特征,然后创建一个可以从中转换的自定义错误类型,可能会将基础错误作为特征对象引用。< / p>