c - 在 Ruby C 扩展中, "rb_..."C 函数是猴子修补版本还是原始版本?

标签 c ruby monkeypatching

在 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

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

最佳答案

我使用 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/

相关文章:

ruby - 使用 ruby​​ mechanize gem 时出现 SSL Reuse 错误

python - 使用 Try 和 Except 时如何在 Python 中单元测试错误

python - 是否有可能在 python3 中完全内置 `str` Monkey Patch

pytest:使用假设时的monkeypatch

c++ - 具有 native 消息传递和非持久连接的 Microsoft Edge 扩展不起作用

ruby - 关于 CoffeeScript 变量范围的困惑

C语言: How do I convert a string parameter from a command line into an array of individual characters?

ruby-on-rails - 一旦复选框为真,如何在再次单击后使其变为假? ( rails 4)

c - 有什么办法可以关闭 gdb 的输入缓冲区检查吗?

c++ - 理解以下来自CSAPP的汇编代码