“ Foo <self”类在Ruby中做什么?

时间:2019-11-11 13:41:09

标签: ruby

在Redis商店RubyGem的sourcecode中,我偶然发现了以前从未见过的这种语法:

class Foo < self
  # ...
end

我的Google-Fu显然还不够强大,因为我一直找不到任何描述其功能的东西。

我要进行的猜测是重新打开Foo,将其自身扩展为超类,从而可以覆盖可以将原始定义称为super的方法。我要关闭吗?

2 个答案:

答案 0 :(得分:6)

class Foo < Bar
end

您是如何告诉Ruby FooBar继承的。

在类定义中,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表达式进行评估,该表达式在对类定义求值时就可以求值。