2016-08-10 9 views
3

Serdeソースを見ながら、私はthe missing_field function渡って走っ:なぜ結果を返す関数はいつもErrを返しますか?

/// 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)) 
} 

なぜこれが便利なのですか?無条件にErrになる場合は、Resultを返すのはなぜですか?

+0

それが結果を返すように宣言された理由、それは常にエラーを返すか、なぜあなたは求めていますか? – Bergi

+0

どちらも、私はそう思います。無条件に 'Err'になる場合は' Result'を返すのはなぜですか? –

答えて

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)) 
    } 
} 

これはdefault trait methodです。この特性を実装するすべての型は、何も特別なことがなければこのメソッドを無料で取得しますが、代わりにそれを再実装することもできます。おそらくほとんどの実装ではこのメソッドは実装されませんが、それはまったく正常なデフォルトでもあります。

1

@Shepmasterが答えたとおり、これは欠落しているフィールドが常にエラーであるデータフォーマットのデフォルトに過ぎません。

欠落したフィールドが必ずしもエラーではないデータフォーマットがあります。 JSONは一般的な例です。次のような構造体:

#[derive(Deserialize)] 
struct S { 
    a: i32, 
    b: Option<i32>, 
} 

は、フィールド「b」が欠落しているJSON文字列{"a":0}から非直列化することができます。 JSONのSerdeデシリアライザでは、欠落しているOptionフィールドをOption::Noneと定義しています。

Here is JSON's implementation of missing_field.

関連する問題