我最近发现了一篇关于 Ruby 中的隐式上下文的有趣文章,我发现这段经历非常开放。我知道 Ruby 不仅包含对self
(默认方法接收器)的引用,还包含对当前类(也称为默认定义或`klass'
)的引用。
从文章中,假设class
定义将当前类self
和当前类都设置为正在定义的类应该是正确的;就我们考虑普通的方法定义(即不使用点语法来定义单例方法)而言,在方法定义的上下文中,用def
,self
指的是接收对象,并且当前类没有改变。
我认为不考虑点语法来定义是安全的原因是 Ruby 还提供了一种打开类的特征类的显式方法,而我感兴趣的是了解在打开特征类时如何管理这两个隐式上下文.
使用def
众所周知的语法打开一个特征类:
class << A
p self
def foo
# ...
end
end
将 foo 定义为 的单例方法,A
即其 eigenclass 的实例方法(be it A'
)。这段代码也会打印#<Class:A>
,所以说<<
语法将当前类self
和当前类都设置为正确A'
吗?