ruby define_method动态块

时间:2012-12-09 02:12:48

标签: ruby metaprogramming

我已经动态创建了一个类,并且我正在尝试向该类添加方法。假设一个字符串表示需要通过此方法评估的命令。

    a = "puts x"

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

感谢您的帮助。

编辑:

k也来自该文件,仅仅在ruby中编写类而不是将备用文件格式作为类来编写是微不足道的,但我想尽可能简单地创建模板。看起来像......

generic

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

我知道调用该方法的方法以及该方法需要做什么。我在运行时确定每个类实例的适当环境,我似乎无法动态地向该方法添加语句。

1 个答案:

答案 0 :(得分:2)

您可以使用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