是否可以在`class_eval`中定义类方法?

时间:2015-06-23 04:52:24

标签: ruby metaprogramming class-eval

我知道可以使用class_eval定义实例方法。是否可以在class_eval

的上下文中定义类方法

2 个答案:

答案 0 :(得分:4)

是的,有可能:

class Foo
end

Foo.class_eval do
  def self.bar
    puts "I'm a class method defined using class_eval and self"
  end

  def baz
    puts "I'm an instance method defined using class_eval without self"
  end
end

Foo.bar # => "I'm a class method defined using class_eval and self"

foo = Foo.new
foo.baz # => "I'm an instance method defined using class_eval without self"

据我所知,这是因为在class_eval内,self是Foo类,而def Foo.bar会创建一个类方法。

答案 1 :(得分:0)

Foo.class_eval do
  ...
end

与:

相同
class Foo
  ...
end

我们需要Module#class_eval来操作一个包含类名的变量。例如,如果:

klass = Foo

你可以写:

klass.class_eval do
  ...
end

而关键字class需要一个常量。

这里class_eval做了两件事:

  • 它将self更改为klassFoo)的值;然后呢
  • 以与关键字klass相同的方式“打开”Fooclass)的值。
相关问题