C扩展中的Ruby关键字参数

时间:2013-12-20 19:11:38

标签: c ruby ruby-c-extension

如何从C扩展中处理Ruby 2.0.0关键字参数?

背景

def example(name: 'Bob' hat_color: 'red')
  puts "#{name} has a #{hat_color} hat!"
end

example                                  #=> "Bob has a red hat!"
example(name: 'Joe', hat_color: 'blue')  #=> "Joe has a blue hat!"

关键字参数(如上所述)在处理具有大量不同调用序列或选项的方法时非常有用。我在C扩展中有一个这样的方法(一个blit方法处理我项目中的大部分OpenGL绘图)我想知道如何从ruby中获取方法句柄关键字参数。

根据我所做的一些研究,我认为可以通过rb_scan_args C函数上的:选项来完成此类处理。但是,我一直无法找到有关如何使用它的任何信息。

1 个答案:

答案 0 :(得分:6)

目前没有直接使用关键字参数的核心方法,即klass.instance_method(:method).parameters永远不会为内置类返回:key

您可能必须定义一个接受参数的方法,在这种情况下是一个哈希并自己解析它。为此,您可以使用rb_scan_args:参数从最后一个参数(例如Hash)获取dir_initialize或类似于OPTHASH_GIVEN_P的代码宏(在array.c中)。从哈希中,您可以使用rb_get_kwargs来获取所需的值。如果您愿意,我还没有研究如何为无法识别的关键字参数生成错误。我认为大多数核心方法都不会进行此检查(至少还没有)。

您可以使用关键字元素在Ruby中定义您的方法,并从那里调用内部C方法。这样可以检查免费的未知密钥以及正确的parameters签名。

我希望通过修改api来改进这种情况,以便在Ruby 2.2中定义方法,这样可以更自然地在C函数中使用关键字参数(参见this issue