全局预置内核模块函数

问题描述 投票:0回答:1

我想像这样添加

Kernel.rand

# I try something like

mod = Module.new do
  def rand(*args)
    p "do something"

    super(*args)
  end
end

Kernel.prepend(mod)
# And I expect this behaviour

Kernel.rand            #> prints "do something" and returns random number
rand                   #> prints "do something" and returns random number
Object.new.send(:rand) #> prints "do something" and returns random number 

不幸的是,上面的代码不能按我想要的方式工作。前置

Kernel.singleton_class
也不起作用

不需要使用

prepend
功能,欢迎任何有助于实现所需行为的建议

ruby metaprogramming mri
1个回答
0
投票

要获得您正在寻找的行为,您必须执行

rand
您创建的类的实例,您已在其中显式包含
Kernel

mod = Module.new do
  def rand(*args)
    p "do something"

    super(*args)
  end
end
Kernel.prepend(mod)
class C
  include Kernel
  def r
    rand
  end
end
c = C.new
  #=> #<C:0x00007fd8544e5a28>
c.r
"do something"
0.24817907057954147
© www.soinside.com 2019 - 2024. All rights reserved.