学习Ruby中的unless

352 阅读2分钟

除非你已经知道...

当我们使用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  

正如你所看到的,唯一的区别是,你现在需要改变条件。所以unlessif 完全相反。

你可能想知道为什么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 关键字。这是因为将elseunless 一起使用会产生混乱的控制流。比如说。

# works, but not advised  
unless passed?  
  puts 'failed'  
else  
  puts 'passed'  
end  

个人想法

在开始时,unless 显然是反直觉的。我花了一些时间才每天使用它而不感到额外的头痛。然而这个关键词是Ruby试图实现的一个很好的例子:增加可读性。