在拨打超级电话时不要传递阻止
如何为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,因为当给出块时, A
的foo
方法的行为会发生变化。
实际上并不那么明显。 从文档我们知道:
- 调用
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)