0

クラスを動的に作成し、クラスにメソッドを追加しようとしています。文字列が、このメソッドで評価する必要のあるコマンドを表していると想定します。

    a = "puts x"

    myobject.metaclass.send(:define_method, k){|x|
         // cannot do this, obviously 
         eval(a)
    }

助けてくれてありがとう。

編集:

kもファイルから取得されているため、別のファイル形式をクラスとして読み取るのではなく、ルビーでクラスを記述するのは簡単ですが、テンプレートの作成をできるだけ簡単にしたいと思います。のように見えます...

generic

do_something:
  environment1:    
    foo arg1 arg2
  environment2:
    bar arg
    baz arg

メソッドが何と呼ばれ、メソッドが何をする必要があるかを知っています。実行時に各クラスインスタンスに適切な環境を決定しますが、メソッドにステートメントを動的に追加できないようです。

4

1 に答える 1

3

を使用できますclass_eval

a = <<-CODE
  def foo(x)
    puts x
  end
CODE

myobject.class.class_eval a

アップデート

あなたはこのようなことをすることができますか?

new_method = <<-CODE
  def #{k}(*args)
    #{a}
  end
CODE

myobject.class.class_eval new_method

あなたが持っていると仮定して:

k = some_method
a = puts args

new_method = <<-CODE
      def #{k}(*args)
        #{a}
      end
    CODE

myobject.class.class_eval new_method
myobject.some_method 1, "foo", "bar"

次に、次のように出力します。

1
foo
bar
于 2012-12-09T02:25:55.100 に答える