【问题标题】:What is << in this context?在这种情况下 << 是什么?
【发布时间】:2013-04-23 18:39:27
【问题描述】:

我正在这里编写本教程: http://rubymonk.com/learning/books/4-ruby-primer-ascent/chapters/39-ruby-s-object-model/lessons/131-singleton-methods-and-metaclasses

课程是关于类/元类的,但它们使用的是我不熟悉的语法。请看下面的的用法

class Object
  def metaclass
    class << self
      self
    end
  end
end


a=Object.new
p a.metaclass.new

我知道def metaclass 是一种方法,但class &lt;&lt; self 是什么意思?它有一个对应的end 块,但我仍然很不清楚这到底在做什么

(注意:上述练习的重点只是表明您不能实例化元类——我理解,在这种情况下,我只是难以理解

谢谢!

【问题讨论】:

标签: ruby class metaclass


【解决方案1】:

class &lt;&lt; self 打开self 的单例类,以便可以为当前self 对象重新定义方法。

让我们看一个具体的例子:

 s = String.new("abc")
 s.metaclass
   => "#<Class:#<String:0x0000010117e5d8>>" 

让我们仔细看看这里发生了什么:

  • metaclass 的定义中,self 指的是当前实例,在本例中为字符串“abc”。
  • 本例中的class &lt;&lt; self 等价于class &lt;&lt; "abc",它打开给定实例的单例类,在本例中为字符串“abc”。
  • 然后它在当前实例的打开的类中返回self——打开的类在示例中是类String

一般来说,metaclass 的定义会打开给定实例/对象的类的类定义,然后返回该类名。

可以在 Yehuda Katz 的文章“Metaprogramming in Ruby: It’s All About the Self”中找到对“自我”的更详细了解。

我还推荐Pragmatic Programmers on The Ruby Object Model and Metaprogramming 的截屏系列。

【讨论】:

    猜你喜欢
    • 2020-04-04
    • 2017-03-28
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 2014-10-27
    • 2019-10-15
    相关资源
    最近更新 更多