在Ruby C扩展中,是" rb _..." C函数是猴子补丁版,还是原版?

时间:2017-07-24 22:55:17

标签: c ruby monkeypatching

在Ruby C扩展中,我想调用function" rb_eval_string"。如果Ruby" eval"是猴子修补,是C函数调用猴子修补版本,还是原始内核版本?

修改 Monkey修补是元编程,在本例中是在Ruby环境中,并且将覆盖Kernel :: eval模块方法。一个例子是:

module Kernel
  def self.eval( eval_string, *extra )
    puts eval_string
  end
end

链接:What does 'Monkey Patching' exactly Mean in Ruby?

2 个答案:

答案 0 :(得分:0)

我使用Ruby docs源视图来测试这些东西。

例如,Kernel#eval method doesn't map to rb_eval_string ...

...这是rb_eval_string没有映射到猴子修补版本的强烈暗示。

如果你深入研究source code,你会注意到内核函数和全局函数都会在链的后面映射到相同的C函数,但rb_eval_string实际上更接近金属和跳过一些测试和调整。

换句话说,没有rb_eval_string没有映射内核对象的虚拟地图功能(这是猴子在更新期间更新的内容)补丁)。

要调用Monkey修补版本,您需要使用Kernel对象调用rb_funcall2

答案 1 :(得分:0)

  

在Ruby C扩展中,我想调用function" rb_eval_string"。如果Ruby" eval"是猴子修补,是C函数调用猴子修补版本,还是原始内核版本?

都不是。它调用C函数。它没有调用任何一个Ruby方法,因为C不了解Ruby方法。

C不知道猴子补丁。没有"猴子修补"在C.如果你调用C函数,你调用C函数,而不是完全不同的C函数。

如果要执行Ruby消息发送,使用Ruby消息调度规则,则无法调用C函数,或者更准确地说,您需要调用执行Ruby消息发送的C函数并执行查找等操作,(令人困惑的)在YARV中不被称为send,而是funcall。它们有很多种变体,都称为rb_funcall的变体。