在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
答案 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
的变体。