2016-10-21 7 views
2

this questionに触発されて、Rustの入力データ型エラーを処理する方法について質問したいと思います。たとえば、次の関数では、入力データ型をenum Animalにする必要があります。ユーザーが実際には定義されていないデータ型や空のデータ型を入力するのはどうでしょうか?入力データの未定義エラー処理

None => Noneまたは_ => Noneを試合に追加する必要がありますか?

use std::fmt; 
use std::io::prelude::*; 

pub enum Animal { 
    Cat(String), 
    Dog, 
} 

impl fmt::Display for Animal { 
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 
     match *self { 
      Animal::Cat(ref c) => f.write_str("c"), 
      Animal::Dog => f.write_str("d"), 
     } 
    } 
} 

fn main() { 
    let p: Animal = Animal::Cat("whiskers".to_owned()); // yes, work! 
    let p: Animal = Animal::BadCat("whiskers".to_owned()); // Badcat not defined,?? 
} 

コンパイラエラー:

error: no associated item named `BadCat` found for type `Animal` in the current scope 
    --> <anon>:20:25 
    | 
20 |   let p: Animal = Animal::BadCat("whiskers".to_owned()); // Badcat not defined,?? 
    |       ^^^^^^^^^^^^^^ 
+1

コードに入力処理はありません。定義されていない 'enum'バリアントのみです。また、「一致」は網羅的です。 'Animal'のすべてのオプションがカバーされているので、 '_'の必要はありません。あなたの場合のように、他のものは普通の型のエラーになります。 – ljedrz

答えて

4

錆は静的型付け、強くで、コンパイル時に型が言語をチェックします。

これは、Python、たとえば、とは違って、それは彼らが無効なunsafe経由強要されたデータを渡している場合を除き(あなたの関数に無効な型を渡すために、ユーザーのために不可能ですが、あなたがいない合理的にできることを意味しますこれを検出してください。boolへの間違った変換に関する私のpostを参照してください。あなたはこれについて心配する必要はありません。

より一般的なケースでは、Rustのタイプバリアントチェックを心配する必要があるのは、Rust外からデータを受け取るときだけです。構成ファイルまたはデータファイル、またはFFI関数を使用します。このような場合、不良データを示すために何らかの種類のResult<Animal,ErrorMessage>を返すのが通例です。ただし、特にFFIの場合には、特に不正な形式のデータを受け取った場合は、panic!に受け入れられる可能性があります。

このタイプのチェックでは通常、列挙型の文は含まれませんが、より高いレベルに再解析しようとしている既知の値のセットの1つである文字列比較または整数比較に関するアサーション列挙型。


この場合には、私が「暗黙の型の強制場合、いくつかの」を意味するためにそれを使用しています、実際には意味「強く型付けされた」ものにいくつかの矛盾と意見の相違があります。

+0

これは非常に有益です、感謝Jsor! – enaJ

関連する問題