Ruby中的ScopeGates

时间:2010-08-11 03:35:37

标签: ruby metaprogramming

我正在阅读Ruby书中的Metaprogramming。在那本书中,当我阅读有关scopegates的内容时,显示了以下代码

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

现在当我执行下面的执行时,我收到一个错误,说明未定义的方法my_method     MyClass.new     MyClass的:0x00000100936a30

MyClass.my_method
NoMethodError: undefined method `my_method' for MyClass:Class
from (irb):11
from /usr/local/bin/irb:12:in `<main>'

为什么my_method被创建,当它被调用为MyClass.new.my_method而不是MyClass.my_method?

1 个答案:

答案 0 :(得分:1)

define_method方法向类添加实例方法。当您在匿名类中调用define_method时,您的方法将作为实例方法添加。要将其添加为类方法,必须将其添加到元类中。

最简单的方法是使用class << self语法。

MyClass = Class.new do
  class << self
    define_method(:my_method) do
      puts "class method"
    end
  end
end

MyClass.my_method # => "class method"