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

Geo*_*Geo 3 ruby metaprogramming

小片1:

module A
  def cm(m,ret)
    class_eval do
     define_method(m.to_sym) do
       return ret
     end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

和代码段2:

module B
  def cm(m,ret)
    class_eval do
      "def #{m} #{ret} end"
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

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

class Whatever
  extend A
  cm("two",2)
end
Run Code Online (Sandbox Code Playgroud)

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

liw*_*iwp 5

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

试试这个:

module B
  def cm(m,ret)
    class_eval("def #{m}() #{ret} end")
  end
end
Run Code Online (Sandbox Code Playgroud)

  • @Jean:当表达式是方法中的最后一个时,return关键字是可选的.因此是end关键字之前或方法定义的参数列表之后的终止符.即`def five()5 end`是有效的语法.然而`def five 5 end`不是. (2认同)