为什么一个返回Result的函数总是返回Err?

3

我在查看Serde源代码时发现了missing_field函数

/// Report that the struct has a field that wasn't deserialized
fn missing_field<V>(&mut self, field: &'static str) -> Result<V, Self::Error>
    where V: Deserialize,
{
    Err(Error::missing_field(field))
}

这有什么用呢?如果Result总是会无条件地返回Err,为什么还要返回它呢?


你是在问为什么它总是返回一个错误,还是为什么它被声明为返回一个结果? - Bergi
两者都有吧。如果结果无条件为“Err”,为什么要返回“Result”呢? - w.brian
2个回答

5
因为你没有包含函数的上下文:
pub trait MapVisitor {

    // ...

    fn missing_field<V>(&mut self, field: &'static str) -> Result<V, Self::Error>
        where V: Deserialize,
    {
        Err(Error::missing_field(field))
    }
}

这是一个默认特质方法。每个实现该特质的类型将自动获得此方法,如果它们没有做任何特殊处理,但也可以选择重新实现它。大多数实现可能不会实现该方法,但它也可以是一个合理的默认值。


1
正如@Shepmaster所回答的那样,这只是一种默认情况,适用于缺少字段始终被视为错误的数据格式。
有些数据格式中,缺失字段并不总是错误。JSON就是一个常见的例子。像下面这样的结构体:
#[derive(Deserialize)]
struct S {
    a: i32,
    b: Option<i32>,
}

可以从缺少字段“b”的JSON字符串{"a":0}中反序列化。JSON的Serde Deserializer将缺失的Option字段定义为Option :: None

这里是JSON实现missing_field的方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接