我正在阅读Paolo Perrotta的Metaprogramming Ruby,我必须说这本书有一个错误,以下是本书第 70 页的 ruby 代码,我将在这里再次过去代码
class Computer
def initialize(computer_id, data_source)
@id = computer_id
@data_source = data_source
end
def self.define_component(name)
define_method(name) {
info = @data_source.send "get_#{name}_info" , @id
price = @data_source.send "get_#{name}_price" , @id
result = "#{name.to_s.capitalize}: #{info} ($#{price})"
return "* #{result}" if price >= 100
result
}
end
define_component :mouse
define_component :cpu
define_component :keyboard
Computer.define_component
是类方法,类似于 Java 中的静态方法。Java 告诉我们的是,静态方法永远无法访问实例属性或没有对象的实例方法。所以,define_component
方法不能使用invoke define_method,它是一个实例方法。从逻辑上讲,在创建对象之前调用了类方法,因此无法初始化@data_source
并且@id
可以初始化(它已经创建了bean)。但是这里没有实例define_component
调用。define_method
那是对的吗?