在观看this video时,我遇到了主持人Dave Thomas提出的一个有趣问题。他在谈论我们在Ruby类方法定义中一直看到的语法:
class Foo
class << self
def bar
puts "inside class method"
end
def self.baz
puts "inside anonymous superclass method"
end
end
end
当然,我们可以访问Foo.bar
,但是如何进行baz
? Dave Thomas谈到了将{匿名超类 - 插入层次结构中的class << self
语法。我尝试了以下方法:
Foo.superclass.baz
并不起作用,因为Foo.superclass
只是Object
。Test.class_eval 'self.self.baz'
......现在事情变得有点荒谬了。思想?
问题出现在视频中的44:23左右。
答案 0 :(得分:0)
在视频结束时,我们会为这个问题提供几个答案。
首先,一件非常丑陋的事情。你可以重新开课:
class Foo
class << self
baz
end
end
另一种方式。由于执行了类定义,因此可以将内部self
返回到变量:
meta = class Foo
class << self
def self.baz
puts "inside anonymous superclass method"
end
self # return self here
end
end
meta.baz
或者,最优雅的是,您可以打开Class
并为其添加方法:
class Class
def meta
class << self
self
end
end
end
# class Foo ...
Foo.meta.baz
原来只是Object#singleton_class
的重新实现。