2

我正在为 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 相同的行为,这似乎是个坏主意,我应该回退并打印红宝石警告吗?(人们甚至读过它们吗?)。

4

1 回答 1

0

您可能应该至少接受一个 Symbol 或一个 String ,因为它们在实践中几乎可以互换使用(因此ActiveSupport::HashWithIndifferentAccess)。

to_s根据您的具体情况,调用您tmp并让其中的任何内容都可以通过这种方式转换为字符串可能是有意义的。但是,如果只接受 String 或 Symbol 才有意义,那么引发 TypeError 是一件非常明智的事情。

尽可能灵活地输入输入但严格控制输出通常是一个好主意,并且可以创建友好的库。

如果人们不阅读警告,那么当事情出错时是他们自己的错,而你完全有权傻笑并说“我告诉过你”。

于 2011-07-06T20:12:48.987 回答