8

如何处理来自 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​​ 的关键字参数。

想法

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

4

1 回答 1

6

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

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

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

我希望通过修改后的 api 来改善这种情况,以在 Ruby 2.2 中定义方法,这将使 C 函数中的关键字参数更自然,除其他外(请参阅此问题

于 2013-12-20T20:36:58.257 回答