【问题标题】:Optional explicit block parameter in Ruby?Ruby中的可选显式块参数?
【发布时间】:2020-10-28 22:45:30
【问题描述】:

正如 cmets 所述,问题实际上就是答案。

如果方法得到一个块,我想进一步使用它。但我也有一个不需要该块的变体。我可以以任何方式做到这一点吗?

例如:

def maybe_gets_block(&blk)
  if blk
    STDERR.puts "Yay! I’ve got a block!"
    @callback = blk
  else
    STDERR.puts "I don’t have a block"
    @callback = nil
  end
end

【问题讨论】:

  • 您在此处显示的方法应该可以正常工作。如果你将一个块传递给maybe_gets_block,它将被转换为一个 Proc 并分配给@callback。如果你没有通过一个块,nil 将被分配。有什么不适用于此解决方案吗?
  • @HolgerJust 谢谢!是的,这是对的。我不知道为什么我认为它不起作用——我几乎可以肯定自从我上次尝试升级 Ruby 以来我还没有升级。那我要不要删掉这个问题?还是留给其他困惑的人?
  • @Bohdan:我会保留这个问题。这个例子写得很好,cmets和答案很有启发性。

标签: ruby optional-parameters ruby-block


【解决方案1】:

使用内核#block_given?

您可能正在寻找Kernel#block_given?。通常,您会将其与Object#yield 结合使用。例如,这里有一个 sn-p,它将作用于一个可选的块或 proc,然后再退回到其他一些动作。

def maybe_gets_block prc=nil
  if block_given?
    yield
  elsif prc.is_a? Proc
    prc.call
  else
    # do something else
  end
end

【讨论】:

  • 这不需要像maybe_gets_block(proc { puts "test" })这样称呼它吗?
  • @Bohdan Nope。 Ruby 总是采用可选块。在大多数情况下,无需将其作为参数显式处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-01
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多