Ruby方法中的if / else

时间:2018-03-29 12:17:51

标签: ruby if-statement coding-style

编辑:我收到了关于重构三元操作的答案。虽然我知道下面所有语言都可以实现,但这并不一定是关于风格的原始问题。我已经编辑了这些片段以反映这一点。

我很好奇,如果在方法中使用else / if,那么它是惯用的还是首选使用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似乎更加混乱。 Rubyists更喜欢明确的else吗? (也很好奇很多语言是隐含的。)

2 个答案:

答案 0 :(得分:6)

实际上取决于。

Guard子句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

你可以用guard子句写它,但听起来很奇怪。所有可能的颜色同样是" main" 颜色。

无论哪种方式,在这种特定情况下都有一个更简洁的替代方案:

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

答案 1 :(得分:1)

我认为这是因为在Ruby中我们有隐式返回,Ruby开发人员倾向于不喜欢使用return。事实上,你的代码片段的替代品将是

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

有点奇怪我想