如何从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函数上的:
选项来完成此类处理。但是,我一直无法找到有关如何使用它的任何信息。
答案 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)