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.但是,我一直无法找到有关如何使用它的任何信息.
目前没有核心方法直接使用关键字参数,即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函数中使用关键字参数,等等(参见本期)