【问题标题】:how to make clean if-else + return value如何使干净的 if-else + 返回值
【发布时间】:2020-08-11 04:21:16
【问题描述】:

在 Ruby 中编码时,我经常写这样的代码

  def someopp(param)
    r_val = nil
    begin
      r_val  = do_something(param)
    rescue Some::Error => e
      r_val  = {} 
    end
    r_val 
  end

我不喜欢它的外观。声明没有真正做任何事情的返回变量,然后再次使用 var 名称来返回它。这很麻烦。我觉得,在 Ruby 中,一定有办法让它更干净漂亮。对这里的语法糖有什么建议吗?

【问题讨论】:

    标签: ruby coding-style


    【解决方案1】:
    def someopp(param)
      do_something(param)
    rescue Some::Error
      {} 
    end
    
    

    def someopp(param)
      do_something(param) rescue {}
    end
    

    但不推荐使用 inline-rescue!

    【讨论】:

    • 值得注意的是rescue可以和def处于同一级别,你不一定需要begin。此外,如果您不使用e,请不要捕获它。
    • @Spikie : 你对 inline-rescue 有什么反对意见?
    • @user1934428 inline-rescue 将拯救 StandardError 及其所有子类,例如 NameError - 这意味着即使代码中的拼写错误也不会引发错误。相反,begin 和 @987654328 @block 会引起你的注意。
    • 但是我也可以使用内联救援指定一个类! IE。 do_something(param) rescue Some::Error {}.
    【解决方案2】:

    如果您确实非常频繁地执行此操作(调用可能引发异常并回退到某个默认值的外部依赖项),可以进一步概括:

    def rescuing(*exceptions, with:)
      yield
    rescue *exceptions
      with
    end
    
    value = rescuing(ZeroDivisionError, with: Float::INFINITY) { 3 / 0 }
    # => Infinity
    

    如果可能的话,如果你能从一开始就避免例外情况会更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-06
      • 2023-03-26
      • 1970-01-01
      • 2014-12-19
      • 2022-07-12
      • 2019-04-24
      • 2016-03-18
      • 2020-08-20
      相关资源
      最近更新 更多