在这种情况下 << 是啥?
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 << self
是什么意思?它有一个对应的end
块,但我仍然很不清楚这到底在做什么
(注意:上述练习的重点只是表明您不能实例化元类——我理解,在这种情况下,我只是难以理解
谢谢!
【问题讨论】:
***.com/a/2505077/16959<<
这应该会有所帮助
【参考方案1】:
class << self
打开self
的单例类,以便可以为当前self
对象重新定义方法。
让我们看一个具体的例子:
s = String.new("abc")
s.metaclass
=> "#<Class:#<String:0x0000010117e5d8>>"
让我们仔细看看这里发生了什么:
在metaclass
的定义中,self
指的是当前实例,在本例中为字符串“abc”。
本例中的class << self
等价于class << "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 中处理事件的最佳方法是啥?
注释是不是允许与预处理器指令在同一行,在这种情况下它们的含义是啥?