在拨打超级电话时不要传递阻止

如何为super呼叫设置块为零?

 class A def foo if block_given? result = yield # do stuff with the yield result end # some more code end end class B  block called # => block called 

我不想两次屈服。 是否有可能block_given?A类中返回false?

背景是我不拥有A类,我不能改变它的foo方法,但我想避免两次调用我的块。 我也不想将伪/空块传递给super,因为当给出块时, Afoo方法的行为会发生变化。

实际上并不那么明显。 从文档我们知道:

  • 调用super传递所有参数
  • 调用super()传递任何参数

文档没有说的是,这仅适用于位置和关键字参数。 super()仍然传递给定的块!

您必须通过调用以下方式显式取消设置块:

 super(&nil) 

这是如何运作的?

您可能知道可以使用显式块参数定义方法:

 def foo(&block) # ... end 

并且你可以将它作为一个块传递给另一个方法:(其他方法可能是super

 def foo(&block) super(&block) end 

现在,如果在调用方法时传递一个块,相应的block变量将是Proc一个实例:

 def foo(&block) p block_given: block_given?, block: block end foo {} #=> {:block_given=>true, :block=>#} 

如果你在没有传递块的情况下调用它,那么block变量将只是nil

 foo #=> {:block_given=>false, :block=>nil} 

因此,如果没有给出block ,则block nil

 super(&block) 

变为:

 super(&nil)