这两个Ruby片段之间的区别是什么?

时间:2010-01-25 08:45:31

标签: ruby metaprogramming

摘录1:

module A
  def cm(m,ret)
    class_eval do
     define_method(m.to_sym) do
       return ret
     end
    end
  end
end

和摘录2:

module B
  def cm(m,ret)
    class_eval do
      "def #{m} #{ret} end"
    end
  end
end

这些模块中定义的方法将用于在类上创建返回特定值的方法。这是一个例子:

class Whatever
  extend A
  cm("two",2)
end

这将创建一个名为2的方法,它将返回2.事情是,第二个代码段中的代码不起作用。有什么想法吗?我以为class_eval可以带一个字符串。

1 个答案:

答案 0 :(得分:5)

class_eval将字符串作为参数,但是您已将字符串传递给块中的函数。

请改为尝试:

module B
  def cm(m,ret)
    class_eval("def #{m}() #{ret} end")
  end
end