2

何かしたいのですが、それが可能かどうかわかりません。あるメソッドが呼び出されても定義されていない場合に備えて、「ジェネリックメソッド」または「デフォルトメソッド」を使用したいと思います。これは簡単な例なので、私のポイントを理解できます。

これはクラスです:

class XYZ

    def a
        #...
    end

    def b
        #...
    end
end

クラスXYZのインスタンス:

n = XYZ.new
n.a
n.b
n.c

ご覧のとおり、定義されていないメソッド「c」を呼び出していると、エラーが発生します。クラスXYZで何かを実行できるので、誰かが定義されていないメソッドを呼び出したときに、メソッドの名前を取得して、メソッドの名前に基づいて何かを実行できますか?そして、これは別の言語で可能ですか(コンパイラーを作成していません)?これが可能であるならば、それはどのように呼ばれますか(理論的に言えば)?

4

2 に答える 2

4

使用method_missing

class XYZ
  def a; end
  def b; end

  def method_missing(name, *args)
    "Called #{name} with args: #{args}"
  end
end

XYZ.new.c #=> "Called c"

また、1.9.2以降でより適切に動作するrespond_to_missing?ように定義する必要があります。を使用する場合は、 /について詳しく読むrespond_to?必要があります。respond_to?respond_to_missing?method_missing

ちなみに、これはメタプログラミングと見なされます。これは、関数の呼び出し方法が原因で、コンパイルされた言語では通常は不可能です。

于 2012-05-23T18:26:49.027 に答える
3

その呼び出されたmethod_missing。オブジェクトで定義されていないメソッドを呼び出すと、rubyはその呼び出しをmethod_missingメソッドにリダイレクトし、エラーを発生させます。

あなたはこれを行うことができます:

class XYZ
  def method_missing(method, *args, &blck)
    puts "called #{method} with arguments #{args.join(',')}"
  end
end

これで、エラーの代わりに、コンソールに出力が表示されます。

于 2012-05-23T18:28:00.523 に答える