【发布时间】:2018-03-29 12:17:50
【问题描述】:
编辑:我收到了有关重构为三元运算的答案。虽然我知道以下所有语言都可以做到这一点,但这并不一定是我最初关于风格的问题的意图。我已经编辑了 sn-ps 以反映这一点。
我很好奇在方法中使用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 似乎更麻烦。 Rubyists 更喜欢显式的else 吗? (也很好奇很多语言是隐含的。)
【问题讨论】:
-
[免责声明:固执己见,但仍然正确] Ruby 主义者根本不喜欢使用
if/else条件,因为它已经带来了太多混乱。 -
您提供的示例不适用于该问题,因为它可以用多种语言写成
return x == 0 ? "Yes" : "No"。您应该在if语句的两个分支上添加一些代码以使问题相关。 -
来自 Martin Fowler 的书 Refactoring: Improving the Design of Existing Code(还有一个 Ruby Edition):“用保护子句替换嵌套条件的关键点是重点之一。如果您使用的是 if- then-else 构造,您对 if 腿和 else 腿赋予相同的权重。这向读者传达了这两条腿的可能性和重要性相同。相反,保护子句说:“这种情况很少见,如果发生了,做点什么然后出去。”“
-
您所指的规则(例如
no-else-return)是关于使用else在return之后,它们不是关于一般禁止else。因此,一个简单且对 linter 友好的解决方法是将结果分配给一个变量并在if-else块之后返回该变量。
标签: ruby if-statement coding-style