在这种情况下 << 是啥?

Posted

技术标签:

【中文标题】在这种情况下 << 是啥?【英文标题】: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 块,但我仍然很不清楚这到底在做什么

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

谢谢!

【问题讨论】:

***.com/a/2505077/16959 &lt;&lt; 这应该会有所帮助 【参考方案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 的截屏系列。

【讨论】:

以上是关于在这种情况下 << 是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在这种情况下,在 AngularJS 中处理事件的最佳方法是啥?

注释是不是允许与预处理器指令在同一行,在这种情况下它们的含义是啥?

允许用户在我的类中定义数组大小而不是使用固定变量的最佳方法是啥,在这种情况下为 8

在这种情况下,“固定”是啥意思?

在这种情况下,脚手架是啥意思?

在这种情况下,我怎么知道 _root 是啥意思?