Ruby define_method问题

nev*_*ame 3 ruby

我正在阅读Ruby中的元编程。

这是本书中的两个代码段:

my_var = "Success"

MyClass = Class.new do 
  puts "#{my_var} in the class definition!"
  define_method :my_method do
    puts "#{my_var} in the method!"
  end
end

MyClass.new.my_method

? Success in the class definition!
  Success in the method!
Run Code Online (Sandbox Code Playgroud)

和:

def define_methods
  shared = 0

  Kernel.send :define_method, :counter do
    shared
  end

  Kernel.send :define_method, :inc do |x|
    shared += x
  end
end

define_methods

counter # => 0 
inc(4) 
counter # => 4
Run Code Online (Sandbox Code Playgroud)

我想知道为什么在第一个示例中定义方法时,而不必在第二个示例中使用动态分派(使用Kernel.send)。

我给了一些想法,但听不懂。

谢谢!

Jör*_*tag 5

Module#define_method是私人的。私有方法只能在没有接收者的情况下调用。因此,在第二个示例中,您需要使用反射(即send)来规避访问限制。

请注意,第一个示例仍然使用动态调度。实际上,在Ruby中,所有内容(变量访问和某些内置运算符除外)都使用动态分配。