5

我知道可以使用class_eval. 是否可以在上下文中定义类方法class_eval

4

2 回答 2

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"

据我所知,这是因为inside 是 Foo 类,doingclass_eval会创建一个类方法。selfdef Foo.bar

于 2015-06-23T04:52:23.897 回答
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
于 2015-06-23T17:58:18.990 回答