Что делает `class Foo <self` в Ruby? - PullRequest
1 голос
/ 11 ноября 2019

Просматривая исходный код редис-магазина RubyGem, я наткнулся на этот синтаксис, которого раньше не видел:

class Foo < self
  # ...
end

Мой Google-Fu явно не мощныйДостаточно, потому что я не смог найти ничего, что описывает то, что это делает.

То, что я угадал , это как-то открывает Foo, расширяя его как суперкласс, таким образомделая возможным переопределение методов, которые могут вызывать исходное определение как super. Я рядом?

Ответы [ 2 ]

6 голосов
/ 11 ноября 2019
class Foo < Bar
end

Как вы говорите Ruby, что Foo наследуется от Bar.

В определении класса self относится к самому классу:

# prints Foo
class Foo
  puts self
end

Итак,

class Foo
  class Bar < self
  end
end

Просто говорит, что Bar вложено в Foo и наследуется от него.

3 голосов
/ 12 ноября 2019

Главное, что вы, похоже, запутываете, это то, что суперклассовая часть определения класса Ruby представляет собой произвольное выражение Ruby .

Итак, что-то вроде этого совершенно законно:

class Foo < if rand < 0.5 then Bar else Qux end end

Очевидно, что это не имеет смысла, но, например, в _why блестящем маленьком веб-фреймворке везунчика Camping , маршруты определеныкак это:

class Edit < R '/post/(\d+)/edit'

и Миграции определены так:

class BlogInitialSchemaCreation < V 1.0

В ActiveRecord, миграции определены так:

class CreateProducts < ActiveRecord::Migration[5.0]

Все это просто использует тот факт, что все, что находится справа от < в определении класса, может любым произвольным выражением Ruby , которое вычисляется при оценке определения класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...