Зачем вам вызывать `super` с блоком в методе initialize класса, наследуемого от Module в Ruby? - PullRequest
2 голосов
/ 24 сентября 2019

При наследовании от Module вы можете передать блок super(), и он будет выполнен:

class Foo < Module
  def initialize
    super() do
      # do some other stuff...
    end
  end
end

Зачем использовать это вместо простого вызова super() без блока, после чего следуетостальная часть кода, такая как:

class Foo < Module
  def initialize
    super()
    # do some other stuff...
  end
end

Менее надуманный пример будет:

class QuestionAttr < Module
  def initialize(method_name)
    super() do
      define_method "#{method_name}?" do
        !!public_send(method_name)
      end
    end
  end
end

Fruit = Struct.new(:colour) do
  include QuestionAttr.new(:colour)
end

fruit = Fruit.new('red')
fruit.colour? # => true

Почему я define_method внутри блока перешел к super(), каксогласно приведенному выше примеру, вместо того, чтобы пропускать блок, переданный super() и define_method впоследствии.

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