我有一个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
。如何防止块被执行?
答案 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
,但您仍然可以在方法中自己处理块。