ruby 或运算符在初始化方法中表现不同

ruby or operator behaving differently inside initialise method

对编程相当陌生,遇到了以下代码,它确实给出了预期的结果,即如果作为 argumnet 传递或默认生成新对象并存储它,它将对象存储在实例变量中。但语法使用的是 or(||) 运算符,据我所知,它总是 returns 布尔值。那么它的行为是不同的还是 or/and 运算符还有更多?

def initialize(args = {})`
 @sms = args[:sms]              || Messenger.new
end

ruby 中的 or 运算符不是“return”布尔值:如果第一个表达式为真(这个术语意味着除了 falsenil), 否则计算为后者

5 || nil => 5
nil || 5 => 5
false || nil => nil
nil || false => false

在ruby中,一切都可以作为表达式求值,表达式会return一个值

所以 || 甚至 && 不 return 一个布尔值它会 return 一个真值或假值

如果是||它将检查第一个表达式是否为真,如果不是,它将转到下一个,然后是下一个,如果没有找到真值,它将 return 最后一个也是假的

irb(main):004:0> nil ||  "true value" || 0
=> "true value"

irb(main):006:0> nil || false || "true value" || 0 || true
=> "true value"

&& 的情况下,它会做相反的事情,它会 return 它可以找到的第一个虚假值

irb(main):001:0> nil && false && "true value" && 0 && true
=> nil

并且 if 条件将理解真值和假值,这些值将是这些逻辑运算符 return

rb(main):007:0> if "true"
irb(main):008:1> puts "true"
irb(main):009:1> else
irb(main):010:1> puts "false"
irb(main):011:1> end
true

irb(main):017:0> if nil
irb(main):018:1> puts "true"
irb(main):019:1> else
irb(main):020:1> puts "false"
irb(main):021:1> end
false