0

私は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_componentJavaの静的メソッドのようなクラスメソッドです。Java が教えてくれたのは、静的メソッドはオブジェクトなしではインスタンス属性またはインスタンス メソッドにアクセスできないということです。したがって、define_componentメソッドは、インスタンス メソッドである invoke define_method を使用してはなりません。論理的に言えば、オブジェクトが作成される前にクラスメソッドが呼び出されたため、初期化する方法はありません@data_source@idBeanが作成されています)。しかし、ここではインスタンスなしでdefine_component呼び出されます。define_methodあれは正しいですか?

4

3 に答える 3

4

あなたはポイントを少し逃しています。はdefine_method実際にはインスタンス変数にアクセスできませんが、define_methodクラスで呼び出されると、実際には通常のインスタンス メソッドが作成されます。このメソッドの名前は define_method へのパラメーターであり、この新しいインスタンス メソッドの本体は渡されたブロックです。

したがって、define メソッドは実際にはコードを実行しません (実行できません)。コードを実行するために呼び出すことができる新しいメソッドを作成するだけです。

要点が理解できたと思います。

于 2013-08-29T11:44:27.427 に答える
1

Ruby には静的メソッドがありません。Ruby クラス メソッドと Java 静的メソッドの唯一の類似点は、どちらもクラスで呼び出すことができるということです。

Ruby では、クラスはオブジェクトです。クラスは Class という名前のクラスのインスタンスであり、他のオブジェクトと同じように独自のインスタンス変数を持つことができます。クラス メソッドは Java の静的メソッドとは異なり、クラスのシングルトン メソッドです。まったく同じ方法で、任意のオブジェクトにインスタンス固有のメソッドを定義できます。

于 2013-08-29T09:14:01.530 に答える