【问题标题】:How can this lambda be rewritten with a guard clause?如何用保护子句重写这个 lambda?
【发布时间】:2017-02-16 18:00:41
【问题描述】:

我正在使用以下 lambda,从 READMEResque::Mailer (https://github.com/zapnap/resque_mailer) 收集:

Resque::Mailer.error_handler = lambda { |mailer, _message, error, action, args| # 需要重新排队接收到 SIGTERM 信号的作业 if error.is_a?(Resque::TermException) Resque.enqueue(mailer, action, *args) 别的 引发错误 结尾 }

不幸的是,在代码库上启用了rubocop,抱怨该方法的if..else 性质,并出现错误:Use a guard clause instead of wrapping the code inside a conditional expression

我尝试在这里设置unless,但到目前为止,无论我设置哪个顺序,raise error 都会被执行。在这里使用保护子句的正确方法是什么?

也就是说,我问这个的原因是,下面的例子似乎表明,如果我用unless 做明显的事情,总是会引发错误。我理解错了吗?

开发[10](主)>类Foo 发展 [10] (main)* def bar 开发 [10] (main)* 将“除非获得 exec 否则放在外部”,除非 1 == 2 开发 [10] (main)* 提出“除非获得 exec” 发展[10](主要)*结束 发展[10](主要)*结束 :酒吧 开发[11](主)> Foo.new.bar 除非得到执行,否则在外面 除非得到 exec 零

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    将条件转换为unless 应该可以工作,并且满足rubocop

     Resque::Mailer.error_handler = lambda { |mailer, _message, error, action, args|
        # Necessary to re-enqueue jobs that receive the SIGTERM signal
        raise error unless error.is_a?(Resque::TermException)
        Resque.enqueue(mailer, action, *args)
      }
    

    【讨论】:

    • 我实际上曾尝试执行一些example code,这似乎表明如果我这样做,将始终引发错误。你能澄清一下吗?
    • 这并不完全正确 - 只有当它是 Resque::TermException 时才会引发错误。
    • 好的,我也更新了我的问题 - 你能解释一下为什么 puts 的行为会有所不同吗?
    • raise 调用将立即引发错误,停止该方法的其余部分运行。您的示例代码调用puts,它不会停止执行,因此两者都将执行。
    • 是的,所以raise 类似于return puts "text" 如果存在这样的东西...谢谢!
    猜你喜欢
    • 2010-12-08
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多