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'
编辑:我收到了关于重构为三元运算的答案。虽然我知道以下所有语言都可以做到这一点,但这不一定是我最初关于风格的问题的意图。我编辑了片段以反映这一点。
我很好奇在方法中使用 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'