C扩展中的Ruby关键字参数

top*_*hat 8 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!"
Run Code Online (Sandbox Code Playgroud)

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

思路

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

Mar*_*une 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函数中使用关键字参数,等等(参见本期)