我正在阅读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?
答案 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"