首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么“类<<自我”中的self指的是类?

问为什么“类<<自我”中的self指的是类?
EN

Stack Overflow用户
提问于 2016-11-02 19:01:02
回答 2查看 144关注 0票数 4

下面的代码输出"I I“。

代码语言:javascript
复制
class Thing
   class << self
      def foo
         puts "I am #{self}."
      end
   end
end

Thing.foo

我认为“自我”指的是一种类型的事物,但它指的是阶级事物。我从前面的一个问题(在评论中链接)中收集到,这与事物是对象的实例这一事实有关。以类<< self开头的块是否在"self“将事物称为实例的上下文中实际执行?这里发生什么事情?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-02 19:12:44

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

代码语言:javascript
复制
class Thing
  puts self.inspect
  def foo
    puts self.inspect
  end
end
puts "==="
Thing.new.foo

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

票数 5
EN

Stack Overflow用户

发布于 2016-11-02 19:16:47

让我们来找出答案。

代码语言:javascript
复制
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>

和

代码语言:javascript
复制
Thing.foo
  # I am Thing.

我们看到class << self和class << Thing是一样的。

这和

代码语言:javascript
复制
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是必需阅读。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40387792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档