什么';这两个Ruby代码片段之间的区别是什么?

什么';这两个Ruby代码片段之间的区别是什么?,ruby,metaprogramming,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 这些模块中定义的方法用于在类上创建方法,该类返回某些值。

片段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\u eval
可以接受一个字符串。

class\u eval
接受一个字符串作为参数,但是您已经将字符串传递给了块中的函数

请尝试以下方法:

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

我仍然认为这个定义本身看起来是错误的。它不是:“def#{m};return#{ret};end”@Jean:如果表达式是方法中的最后一个表达式,则return关键字是可选的。结束符在方法定义的end关键字之前或参数列表之后也是如此。也就是说,
def five()5 end
是有效的语法。但是,
defFive 5 end
不是。