我正在为 ruby 开发一个 C 扩展,我正在访问的 C 库中的一个函数接收一个选项结构,该结构似乎自然地转换为 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");
}
现在我的问题是当一个选项有一个定义的值但 ruby 类型在 C 中没有意义。
即使是可选值,我也应该引发类型错误吗?这似乎有点矫枉过正,我应该回退到默认值吗?回退到默认值的问题是传递 {"opt1" => 123 } 的用户会看到与未定义 opt1 相同的行为,这似乎是个坏主意,我应该回退并打印红宝石警告吗?(人们甚至读过它们吗?)。