私は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を定義していないかのように、悪いアイデアのように見えますが、ルビ警告を出力するかどうかは同じです。 (人々はそれを読んでも?)。
TypeErrorのRDocを読んでいる場合:「予想されたタイプではないオブジェクトに遭遇したときに発生します。私はそれがまさにここのあなたの場合に起こると思います。デフォルト値に戻ると、混乱が生じるだけです。 TypeErrorを上げるための方法と条件を適切に文書化すれば、それについて何も悪いことはありません。 – emboss
ええ、私は関数の通常の引数でそれを行います(オプションではありません)。オプションのパラメータで同じことをするのはあまりにも厳しいのではないかと思っていましたが、予期せぬ値で終わるよりも騒々しく失敗する方が良いでしょう。 – Camilo