Ruby的if/else方法

0 ruby if-statement coding-style

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


我很好奇,如果它是惯用的或者总是else在使用if/ else在方法中时使用.

例如,在JS中,这在风格上是可接受的(有时是首选的)

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

  // do something else
  return differentAnswer;
}
Run Code Online (Sandbox Code Playgroud)

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

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

但是从我见过的Ruby,它总是:

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

我还得到一条评论说,不使用elseRuby中的内容似乎更加混乱.Rubyists更喜欢显式else吗?(也很好奇很多语言是含蓄的.)

ndn*_*kov 6

这实际上取决于.

Guard子句return实际上经常在Ruby中使用.他们甚至受到广泛接受的风格指南的鼓励.

但是,在角落案件中使用了保护条款.所以你必须问自己,实际的可能值是x多少0


如果它很少0而且有些特殊,那么return一开始就完全可以接受(并鼓励).

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

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

  n * factorial(n.pred)
end
Run Code Online (Sandbox Code Playgroud)

理由是这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
Run Code Online (Sandbox Code Playgroud)

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


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

x.zero? ? 'Yes' : 'No' 
Run Code Online (Sandbox Code Playgroud)