gpt4 book ai didi

ruby - 调用 super 时不要传递 block

转载 作者:数据小太阳 更新时间:2023-10-29 06:55:57 24 4
gpt4 key购买 nike

如何为 super 调用设置一个 block 为 nil?

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

class B < A
def foo
block_result = yield
# process block results and store it
# ...
super
end
end

B.new.foo { puts "block called" }
# => block called
# => block called

我不想让 block 两次。 block_given? 在类 A 中是否有可能返回 false?

背景是我不拥有 A 类,我无法更改它的 foo 方法,但我想避免调用我的 block 两次。我也不想将虚拟/空 block 传递给 super,因为 Afoo 方法的行为在给定 block 时发生变化。

最佳答案

其实并没有那么明显。来自documentation我们知道:

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

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

您必须通过调用显式取消设置 block :

super(&nil)

这是如何运作的?

您可能知道可以使用显式 block argument 定义方法:

def foo(&block)
# ...
end

并且您可以将它作为一个 block 传递给另一个方法:(另一个方法可能是 super)

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

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

def foo(&block)
p block_given: block_given?, block: block
end

foo {}
#=> {:block_given=>true, :block=>#<Proc:0x00007ff4990d0030>}

如果你调用它而不传递 block ,block 变量将只是nil:

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

所以如果没有给出 block ,blocknil 并且

super(&block)

变成:

super(&nil)

关于ruby - 调用 super 时不要传递 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48279119/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com