Как предотвратить "супер" от сдачи - PullRequest
0 голосов
/ 04 июня 2018

У меня есть класс Duck с методом initialize, который возвращает блоку:

class Duck
  def initialize()
    if block_given?
      yield(self)
    end
  end
end

и класс TalkingDuck, который приветствует программиста при его инициализации.

class TalkingDuck < Duck
  def initialize()
    super()
    puts 'I am a duck'
  end
end

Когда я вызываю конструктор TalkingDuck.new с блоком, я не хочу, чтобы этот блок выполнялся.Это:

TalkingDuck.new { puts 'Quack' }

должен печатать только I am a duck, но не Quack.Как я могу предотвратить выполнение блока?

1 Ответ

0 голосов
/ 04 июня 2018

Ruby неявно передает аргументы и блок текущего метода в super.С аргументами этого можно избежать, явно вызвав super без аргументов (super()).То же самое можно сделать с блоками.Блок может быть передан методу с помощью &:

greet = proc { puts 'hi' }
do_some_stuff(&greet)

, вы можете явно избежать передачи блока с помощью &nil.В этом случае это означает, что вы можете изменить initialize метод TalkingDuck на:

def initialize()
  super(&nil)
  puts 'I am a duck'
end

, и он будет явно отбрасывать любой данный блок и не передавать его дальше до super, но вывсе еще можете обрабатывать блок внутри метода.

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