2011-07-06 7 views
2

私はRubyのC拡張を開発しています。私がアクセスしているCライブラリの関数の1つは、ruby-worldのオプションハッシュに自然に変換されるようなオプションの構造体を受け取ります。Ruby C拡張でオプションのハッシュ値をチェックする際のベストプラクティスは何ですか?

構造体は、ルビ側のハッシュが指定されたオプションの値を定義していない場合、既知のデフォルト値で初期化されています。

VALUE tmp; 

tmp = rb_hash_aref(r_hash, rb_str_new2("opt1")); 

if(TYPE(tmp) == T_STRING){ 
    strcpy (c_learn_param->opt1, StringValuePtr(tmp)); 
}else{ 
    strcpy (c_learn_param->opt1, "default value 1"); 
} 

今オプションが定義された値を持っているとき、私の問題があるが、私はしても型エラーを発生させる必要がありますルビータイプはC.

に意味がありません:C側では、私はこれらの線に沿っていくつかを持っていますオプションの値は?それは過度のようだ、私はデフォルトに後退する必要がありますか? {"opt1" => 123}は、opt1を定義していないかのように、悪いアイデアのように見えますが、ルビ警告を出力するかどうかは同じです。 (人々はそれを読んでも?)。

+1

TypeErrorのRDocを読んでいる場合:「予想されたタイプではないオブジェクトに遭遇したときに発生します。私はそれがまさにここのあなたの場合に起こると思います。デフォルト値に戻ると、混乱が生じるだけです。 TypeErrorを上げるための方法と条件を適切に文書化すれば、それについて何も悪いことはありません。 – emboss

+0

ええ、私は関数の通常の引数でそれを行います(オプションではありません)。オプションのパラメータで同じことをするのはあまりにも厳しいのではないかと思っていましたが、予期せぬ値で終わるよりも騒々しく失敗する方が良いでしょう。 – Camilo

答えて

0

ほとんどのSymbolまたはStringは、実際にはほとんど互換的に使用されるため(おそらくActiveSupport::HashWithIndifferentAccess)、それを受け入れるべきです。

具体的な状況によっては、tmpto_sに電話して、そのようなものをそのように文字列に変換することができます。しかし、StringまたはSymbolを受け入れることが理にかなっているのであれば、TypeErrorを発生させることは完全に分かりやすいことです。

あなたの入力とできるだけ柔軟であるが、あなたの出力に厳密に従うことは、通常、良いアイデアであり、フレンドリーな図書館のためのものです。

もし人々が警告を読まなければ、それは事態が悪くなると自分自身の責任であり、あなたはまばゆい人の権利の範囲内にあり、「私はあなたに言った」と言う。

+0

ああ、私は配列キーを意味するわけではありません。文字列キーとシンボルキーの両方を受け入れることをお勧めします。たとえば、文字列が必要で、誰かがオブジェクトを渡す場合、問題はハッシュの値部分にあります。 to_sのアイデアは、私が期待している値が文字列であるときに終わるかもしれない何かのように聞こえるが、私が必要とする値がC側で2倍と言うなら、誰かがオブジェクトを渡すと、それを扱う明白な方法はない。 – Camilo

+1

@Camilo:あなたの問題は鍵ではなく値である?その場合、TypeErrorを引き上げることは、あなたが必要なものに賢明にその値を変換できない場合、妥当と思われます。 –

関連する問題