Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ruby define_方法动态块_Ruby_Metaprogramming - Fatal编程技术网

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