如何防止'超级'屈服

时间:2018-06-04 07:11:27

标签: ruby

我有一个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 :(得分:9)

Ruby隐式地将参数和当前方法的块传递给super。使用参数,可以通过显式调用super而不使用参数(super())来避免这种情况。使用块可以完成同样的事情。可以使用&

将块传递给方法
greet = proc { puts 'hi' }
do_some_stuff(&greet)

您可以明确避免使用&nil传递阻止。在这种情况下,这意味着您可以将initialize的{​​{1}}方法更改为:

TalkingDuck

并且它将明确地丢弃任何给定的块,并且不会将其进一步传递到def initialize() super(&nil) puts 'I am a duck' end ,但您仍然可以在方法中自己处理块。