Ruby 的 if / else 方法

Ruby's if / else in methods

编辑:我收到了关于重构为三元运算的答案。虽然我知道以下所有语言都可以做到这一点,但这不一定是我最初关于风格的问题的意图。我编辑了片段以反映这一点。


我很好奇在方法中使用 if/else 时,它是惯用的还是更喜欢始终使用 else

例如,在 JS 中,这在风格上是可以接受的 (and sometimes preferred)

function jsFunc(x) {
  if (x == 0) {
    // do a bunch of stuff here
    return answer;
  }

  // do something else
  return differentAnswer;
}

而且我在Python中也看到了类似的风格:

def py_func(x):
    if x == 0:
        # do a bunch of stuff here
        return answer
    # do something here
    return differentAnswer

但是从我看到的 Ruby 来看,它总是:

def ruby_method(x)
  if x == 0
    # do a bunch of stuff here
    answer
  else
    # do something else
    differentAnswer
  end
end

我还收到一条评论,说在 Ruby 中不使用 else 似乎更混乱。 Ruby 支持者更喜欢明确的 else 吗? (也很好奇很多语言是隐含的。)

我认为这是因为在 Ruby 中我们有隐含的 return 而 Ruby 开发人员往往不喜欢使用 return。事实上,您的代码段的替代方案是

def ruby_method(x)
  return "Yes" if x.zero?
  "No"
end

我觉得有点奇怪

这实际上取决于。

保护条款 return 实际上在 Ruby 中经常使用。 the widely accepted style guide.

甚至鼓励他们

但是,保护条款用于极端情况。所以你必须问问自己 x 的可能值是多少,它实际上是多少 0?


如果很少 0 并且有点特殊,那么开头的 return 是完全可以接受的(并鼓励)。

例如,这是一个完全可用(即使不是最佳)的阶乘实现:

def factorial(n)
  return 1 if n.zero?

  n * factorial(n.pred)
end

原因是 0 绝对是一个极端情况。


另一方面,如果 'Yes''No' 情况既可能又正常,则应在代码中直观地表示这种对称性 (if - else).

例如,考虑一个机器人在红绿灯前决定做什么:

def take_action(light)
  if light.green?
    go
  elsif light.yellow?
    prepare_to_go
  elsif light.red?
    wait
  end
end

你可以用保护子句来写,但听起来很奇怪。所有可能的颜色都是 "main" 颜色。


无论如何,在这种特定情况下,有一个更简洁的选择:

x.zero? ? 'Yes' : 'No'