我正在開發一個針對ruby的C擴展,我正在訪問的C庫中的一個函數接收一個選項結構,它似乎很自然地轉換爲ruby-world中的選項哈希。在ruby C擴展中鍵入檢查選項哈希值時的最佳做法是什麼?
當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.
應我甚至提高類型的錯誤爲可選值?這看起來過於誇張,我應該回到默認?回落到默認值的問題是,通過{「opt1」=> 123}的用戶會看到相同的行爲,就好像他沒有定義opt1這似乎是一個壞主意,我是否應該回退並打印紅寶石警告? (人們甚至讀過它們嗎?)。
如果您閱讀TypeError的RDoc:「遇到不屬於預期類型的對象時引發。我認爲這就是你在這裏發生的事情。回落到默認值只會導致混淆。如果你正確地記錄了引發TypeError的方法和條件,那麼它就沒有什麼不好了。 – emboss
是的,我確實在函數的常規參數(非可選)上做了這個。我在想,如果在選擇性參數上做同樣的事情會不會太嚴格,但是,你說得對,最好是失敗而不是結果出乎意料的價值。 – Camilo