我很好奇,如果在方法中使用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
吗? (也很好奇很多语言是隐含的。)
答案 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
有点奇怪我想