私は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
あれは正しいですか?