2016-08-10 1 views
3

ich über the missing_field function lief, während er durch die Serde Quelle suchen:Warum gibt eine Funktion, die ein Ergebnis zurückgibt, immer Err zurück?

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

Warum dies nützlich? Warum eine Result zurückgeben, wenn sie unbedingt Err ist?

+0

Sind Sie fragen, warum es immer einen Fehler zurückgibt, oder warum wurde es als Rückkehr ein Ergebnis erklärt? – Bergi

+0

Beide, denke ich. Warum ein "Ergebnis" zurückgeben, wenn es "Err" ist, bedingungslos? –

Antwort

5

Da Sie nicht den Kontext der Funktion einschließlich:

pub trait MapVisitor { 

    // ... 

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

Dies ist ein default trait method. Jeder Typ, der diese Eigenschaft implementiert, erhält diese Methode kostenlos, wenn sie nichts Besonderes tut, aber sie kann sie stattdessen neu implementieren. Vermutlich werden die meisten Implementierungen die Methode nicht implementieren, aber es kann auch nur ein normaler Standard sein.

1

Wie @Shempmaster geantwortet hat, ist dies nur ein Standard für Datenformate, in denen ein fehlendes Feld immer ein Fehler ist.

Es gibt Datenformate, in denen ein fehlendes Feld nicht immer ein Fehler ist. JSON ist ein häufiges Beispiel. Eine Struktur wie folgt aus:

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

aus dem JSON-String {"a":0}, in dem deserialisiert werden das Feld „b“ fehlt. Der Serde Deserializer für JSON definiert ein fehlendes Optionsfeld, das Option::None bedeutet.

Here is JSON's implementation of missing_field.

Verwandte Themen