用逻辑语句控制流程

虽然它看似违反直觉,但你可以使用逻辑运算符来确定是否运行语句。例如:

File.exist?(filename) or STDERR.puts "#{filename} does not exist!"

这将检查文件是否存在,如果不存在则仅打印错误消息。or 语句是懒惰的,这意味着一旦确定它的值是真还是假,它就会停止执行。一旦发现第一项是真的,就没有必要检查另一项的值。但如果第一个词是假的,它必须检查第二个词。

常用的是设置默认值:

glass = glass or 'full' # Optimist! 

如果 glass 尚未设置,则将其设置为 full。更简洁地说,你可以使用 or 的符号版本:

glass ||= 'empty' # Pessimist. 

只有当第一个语句为 false 时,才可以运行第二个语句:

File.exist?(filename) and puts "#{filename} found!"

同样,and 是懒惰的,因此只有在必要时才会执行第二个语句才能得到一个值。

or 运算符的优先级低于 and。同样,||的优先级低于 &&。符号形式的优先级高于单词形式。这很方便你知道何时需要将此技术与赋值混合使用:

a = 1 and b = 2
#=> a==1
#=> b==2
a = 1 && b = 2; puts a, b
#=> a==2
#=> b==2

请注意,Ruby 样式指南建议

andor 关键字被禁止。最小的附加可读性不值得引入细微错误的高概率。对于布尔表达式,请始终使用 &&||。对于流程控制,使用 ifunless; &&||也可以接受但不太清楚。