ruby define_方法动态块
我已经动态创建了一个类,并且正在尝试向该类添加方法。假设一个字符串表示需要使用此方法计算的命令ruby define_方法动态块,ruby,metaprogramming,Ruby,Metaprogramming,我已经动态创建了一个类,并且正在尝试向该类添加方法。假设一个字符串表示需要使用此方法计算的命令 a = "puts x" myobject.metaclass.send(:define_method, k){|x| // cannot do this, obviously eval(a) } 谢谢你的帮助 编辑: k也来自文件,用ruby编写类而不是作为类读取另一种文件格式是很简单的,但是我想使创建模板尽可能简单。看起来像 gen
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
我知道该方法调用了什么以及该方法需要做什么。我在运行时为每个类实例确定合适的环境,但似乎无法动态地向方法添加语句 您可以使用
class\u eval
a = <<-CODE
def foo(x)
puts x
end
CODE
myobject.class.class_eval a
你就不能计算一个方法字符串吗?谢谢你的回复。在这种情况下,a是不可变的。我正在解析ops人员创建的文件,因此我使格式具有更简单的语法。我已经动态创建了这个类,并且有一个表达式数组作为字符串,需要添加到相应的方法中。是的,我知道。我想知道它是从哪里来的。:-)诚然,这个问题的措辞很糟糕。这个方法的参数数量是静态的吗?不,但为了简单起见,我省略了这个细节,我应该能够用*args或其他东西来解决这个部分。删除-不能在这里格式化,只是要扩展初始问题。
new_method = <<-CODE
def #{k}(*args)
#{a}
end
CODE
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