对编程来说相当陌生,并且遇到了以下代码,这些代码确实给出了预期的结果,也就是说,如果作为argument传递,它会将对象存储在实例变量中,或者默认生成一个新对象并存储它。但语法是使用or(||(运算符,据我所知,它总是返回布尔值。那么,它的行为是不同的,还是对运营商有更多的影响?
def initialize(args = {})`
@sms = args[:sms] || Messenger.new
end
ruby中的or运算符不"返回";一个布尔值:如果第一个表达式是truthy(一个表示除false
和nil
之外的所有内容的术语(,则它求值给第一个表达式,否则它求值给后一个
5 || nil => 5
nil || 5 => 5
false || nil => nil
nil || false => false
在ruby中,所有的东西都可以作为一个表达式进行求值,表达式将返回一个值
所以||
甚至&&
都不返回布尔值,它将返回真值或假值
在||的情况下,它将检查第一个表达式是否正确,如果不正确,它将转到下一个表达式,然后下一个,如果没有找到正确的值,它将返回最后一个也是错误的
irb(main):004:0> nil || "true value" || 0
=> "true value"
irb(main):006:0> nil || false || "true value" || 0 || true
=> "true value"
在&&
的情况下,它将执行相反的操作,它将返回它能找到的第一个错误值
irb(main):001:0> nil && false && "true value" && 0 && true
=> nil
if条件将理解真值和假值,这些逻辑运算符将返回
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