在Redis商店RubyGem的sourcecode中,我偶然发现了以前从未见过的这种语法:
class Foo < self
# ...
end
我的Google-Fu显然还不够强大,因为我一直找不到任何描述其功能的东西。
我要进行的猜测是重新打开Foo,将其自身扩展为超类,从而可以覆盖可以将原始定义称为super
的方法。我要关闭吗?
答案 0 :(得分:6)
class Foo < Bar
end
您是如何告诉Ruby Foo
从Bar
继承的。
在类定义中,self
引用类本身:
# prints Foo
class Foo
puts self
end
所以
class Foo
class Bar < self
end
end
只是说Bar
嵌套在Foo
下,并且继承自它。
答案 1 :(得分:3)
您似乎弄不清楚的主要事情是:Ruby类定义的超类部分是任意Ruby表达式。
所以,这样的事情是完全合法的:
class Foo < if rand < 0.5 then Bar else Qux end end
显然,这没有意义,但是例如,在_为什么幸运的僵尸的精妙的小型Web微框架Camping中,路由的定义如下:
class Edit < R '/post/(\d+)/edit'
和迁移的定义如下:
class BlogInitialSchemaCreation < V 1.0
在ActiveRecord
中,迁移的定义如下:
class CreateProducts < ActiveRecord::Migration[5.0]
所有这些简单地利用了这样的事实:类定义中<
右边的任何内容都可以通过任意的Ruby表达式进行评估,该表达式在对类定义求值时就可以求值。