2

私はrubyのC拡張機能を開発しています。アクセスしているCライブラリの関数の1つは、ruby-worldのオプションハッシュに自然に変換されるように見えるオプション構造体を受け取ります。

ルビー側のハッシュが特定のオプションの値を定義していない場合、構造体は既知のデフォルト値で初期化されます。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では意味をなさない場合です。

オプションの値でもタイプエラーを発生させる必要がありますか?それはやり過ぎのようですが、デフォルトにフォールバックする必要がありますか?デフォルトにフォールバックする際の問題は、ユーザーが{"opt1" => 123}を渡すと、悪い考えのように思われるopt1を定義していない場合と同じ動作が表示されることです。フォールバックして、ルビーの警告を出力する必要がありますか?(人々はそれらを読むことさえありますか?)

4

1 に答える 1

0

実際にはほぼ同じ意味で使用されるため、少なくとも Symbol または String を受け入れる必要があります (したがって、ActiveSupport::HashWithIndifferentAccess )。

特定の状況によっては、あなたを呼び出しto_stmp、その中のすべてをそのように String に変換できるようにすることが理にかなっている場合があります。ただし、文字列またはシンボルを受け入れることが理にかなっている場合は、TypeError を発生させることは完全に賢明なことです。

入力はできるだけ柔軟に、出力は厳密にすることは、通常は良い考えであり、使いやすいライブラリになります。

人々が警告を読まない場合、物事がうまくいかないのは彼ら自身の責任であり、あなたはニヤニヤして「そう言った」と言う権利があります.

于 2011-07-06T20:12:48.987 に答える