除非你已经知道...
当我们使用if 语句时,我们要检查一个条件是否为真。如果是真的,你就执行一个代码块。如果是假的,则不执行该代码。简单地说,if ,检查一个真实的值。像许多其他语言一样。
你可以认为unless 与此完全相反。unless 可以取代if 关键字,但它会检查一个虚假的值,如果它所检查的条件是假的,则执行代码。
语法上,这显示在下面。
puts "Passed" if score > 50
if score > 50
puts "Passed"
end
成为
puts "Passed" unless score < 50
unless score < 50
puts "Passed"
end
正如你所看到的,唯一的区别是,你现在需要改变条件。所以unless 与if 完全相反。
你可能想知道为什么Ruby要给你一个专门的关键字。好吧,这样写你的控制流会改善代码的视觉效果,因为你将不再需要在更复杂的条件下使用not 操作符来翻转你的条件。
样本。
# okay, understandable, but your eye may miss the "!"
do_something if !some_condition
# okay, readable, understandable, but "not" is not always liked by Ruby developers
do_something if not some_condition
# okay, readable, understandable
do_something unless some_condition
作为一个修改器
你可能已经注意到在上一个例子中,unless 也可以作为一个类似于if 的修饰符来使用。
在这个例子中。
unless score < 50
puts "Passed"
end
成为
puts "Passed" unless score < 50
左边的行为是一个then条件(将被执行的代码),右边的行为是一个测试条件。
注意事项
尽管在unless 语句中使用else 是完全可能的,但在最佳实践中,建议你避免这样做,当你需要有一个else条件时,最好使用if 关键字。这是因为将else 与unless 一起使用会产生混乱的控制流。比如说。
# works, but not advised
unless passed?
puts 'failed'
else
puts 'passed'
end
个人想法
在开始时,unless 显然是反直觉的。我花了一些时间才每天使用它而不感到额外的头痛。然而这个关键词是Ruby试图实现的一个很好的例子:增加可读性。