2

何度も試みましたが、define_method() を使用してメソッドを提供するメソッドを作成できません。

http://www.ruby-doc.org/core-1.9.3/Module.htmlにある Module クラスのドキュメントを理解していれば、次のいずれかを実行できるはずです。

define_method(シンボル、メソッド) → new_method

define_method(symbol) { ブロック } → proc

define_method(symbol) { block } を使用できますが、受け取ったのはメソッドのようです (リンク先のドキュメントで概説されている proc ではありません)。

class M
  define_method(:hello) { puts "Hello World!"}
end

M.new.hello

ここでの私の2つの懸念は次のとおりです。2. 「define_method(symbol, method) → new_method」のメソッドを提供する方法がわかりません。この形式の define_method の使用方法がわかりません。

誰かがこれに光を当てることができれば、それは大歓迎です! :) どうもありがとう!

4

2 に答える 2

0

次のようにクラスでメソッドを定義することで、これを行うことができます。

class TestClass
  def a_method
  end
  # Store the method in a class variable; define_method is a Module 
  # method and needs to be called from within this context
  @@x = define_method(:another_method, TestClass.new.method(:a_method))
  def x
    @@x
  end

  # And to get a block...
  @@y = define_method(:yet_another_method) {}
  def y
    @@y
  end
end

メソッドを呼び出すと、次のxようになります。

TestClass.new.x
#<Method: TestClass#a_method>

メソッドを呼び出すと、次のyようになります。

TestClass.new.y
#<Proc:0x00000000aebc30@(irb):75 (lambda)>

ここで注意が必要なのは、実行しているのと同じクラス(またはスーパークラス)のオブジェクトのメソッドが必要なことですdefine_method。そうしないと、機能しません。たとえば、@@x行を置き換える場合:

...
@@x = define_method(:another_method, String.new.method(:gsub))
...

はサブクラスではないため、TypeError次のようになります。TestClassString

TypeError: bind argument must be a subclass of String

これ機能することを確認します。

...
@@x = define_method(:another_method, Object.new.method(:object_id))
...

次のような出力があります。

TestClass.new.x
#<Method: Object(Kernel)#object_id>

同じクラス階層のメソッドが必要な理由は、オブジェクト指向コードのカプセル化とプライバシーを強制するためだと思います(そうでない場合は、別のクラスのメソッドを渡すことでプライベートメソッドと変数にアクセスできます)。

于 2013-02-22T12:57:43.853 に答える
0

define_method実際、使用法に応じてaProcまたは a を返します。Method

最初のケースでは、 aProcが返されます:

class Test
  x = define_method :test_method { nil }
  puts x.inspect
end


Test.new.test_method

コンソール出力で上記を実行すると、次のようになります。

#<Proc:0x007fe12104e228@test.rb:3 (lambda)>

UnboundMethod2 番目のケースは、次のタイプの を返しますMethod

class Test2 < Test
  y = define_method :test_method2, Test.instance_method(:test_method)
  puts y.inspect
end

Test2.new.test_method2

上記の出力

#<UnboundMethod: Test#test_method>

これは非常に不自然な例であり、渡すメソッドを定義することdefine_methodは、この場合にはあまり役に立ちません。また、そうなるケースも考えられません。

于 2012-11-19T20:35:32.483 に答える