有没有一种惯用的方法来实现条件块“传递”?

时间:2014-04-29 18:53:58

标签: ruby conditional block idioms

是否有一种干净的方法可以有条件地将块作为参数传递给Ruby中的另一个方法?

在我的Rails应用程序中,我使用包装器定义了一些自定义的ActionMailer行为,我希望优雅地处理隐式(没有给定块)和显式(给定块)视图模板。

class Mailer < ::ActionMailer::Base
  # ...
  def signed_mail(opts = {}, &block)
    # ...
    mail mail_opts, &(block_given? ? block : nil)
  end
end

是否有一种更为惯用的方法可选将给定的块传递给mail三元运算符提供DRYer代码而不是使用{{1} } / if,但看起来仍然很尴尬。

1 个答案:

答案 0 :(得分:2)

对于没有传递阻止的情况,你不必做任何特别的事情:

class Mailer < ::ActionMailer::Base
  # ...
  def signed_mail(opts = {}, &block)
    # ...
    mail mail_opts, &block
  end
end

如果没有给出阻止,block已经是零,所以这将忠实地传递缺乏障碍。