在 Ruby C 扩展中,我想调用函数“rb_eval_string”。如果 Ruby “eval” 是经过猴子修补的,那么 C 函数调用是经过猴子修补的版本,还是原始内核版本?
编辑: Monkey 修补是元编程,在本例中是在 Ruby 环境中,并且会覆盖 Kernel::eval 模块方法。一个例子是:
module Kernel
def self.eval( eval_string, *extra )
puts eval_string
end
end
最佳答案
我使用 Ruby 文档源代码 View 来测试这些内容。
例如,Kernel#eval method doesn't map to rb_eval_string
...
...这是一个强烈暗示,rb_eval_string
不会映射到猴子修补版本。
如果您深入研究source code您会注意到,内核函数和全局函数都映射到链中的同一个 C 函数,但 rb_eval_string
实际上更接近金属,并且跳过了一些测试和调整。
换句话说,否,rb_eval_string
不会映射内核对象的虚拟映射函数(这是在猴子修补期间更新的内容)。
要调用猴子修补版本,您需要使用 Kernel 对象调用 rb_funcall2
。
关于c - 在 Ruby C 扩展中, "rb_..."C 函数是猴子修补版本还是原始版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45291326/