为什么“class<< self”中的self会引用该类?

时间:2016-11-02 19:01:03

标签: ruby

下面的代码输出“我是事。”

class Thing
   class << self
      def foo
         puts "I am #{self}."
      end
   end
end

Thing.foo

我认为“自我”指的是Thing类型的对象,但它指的是Thing类。我从上一个问题(在评论中链接)中收集到,这与Thing是Object的一个实例有关。块是否以类&lt;&lt;开头? self实际上是在“self”指的是Thing作为实例的上下文中执行的?这里发生了什么?

2 个答案:

答案 0 :(得分:5)

内部方法self指的是实例,在类/模块定义中,但在任何方法之外 - 指向类/模块本身。

class Thing
  puts self.inspect
  def foo
    puts self.inspect
  end
end
puts "==="
Thing.new.foo

尝试上面的代码,你可能会看到那里发生的事情:首先解析类,然后执行第一个puts。然后puts "==="打印出"==="字符串。然后,从方法内部打印实例。

答案 1 :(得分:4)

让我们找出答案。

class Thing
   puts "self=#{self}"
   class << self
     puts "self in singleton class=#{self}"
     def foo
       puts "I am #{self}."
     end
   end
end
  # self=Thing
  # self in singleton class=#<Class:Thing>

Thing.foo
  # I am Thing.

我们看到class << selfclass << Thing相同。

这与

相同
class Thing
end

class << Thing
   puts "self in singleton class=#{self}"
   def foo
     puts "I am #{self}."
   end
end
  # self in singleton class=#<Class:Thing>

Thing.foo
  # I am Thing.
班级中的

class << self或班级外的class << Thing只做一件事而且只做一件事:它将self更改为Thing在随后的块中的单例类。这就像说它将范围更改为块中的Thing的单例类一样。

Yehuda Katz的

This article需要阅读。