一般来说x ||= y 等价于x = x || y,只是简写。它以扩展形式实现,与&&=、+= 或-= 相同。
大多数编程语言,包括 Ruby,都会在遇到的第一个 true 值上停止执行逻辑比较语句(如 ||)并返回该值。同样,当使用&& 时,它将在第一个 false 值处停止。
一般来说:
假 || foo()
这将返回false,而不是评估foo()。
最好将模式描述为“惰性初始化器”,即变量仅定义一次,但仅在实际使用时才定义。这与“急切的初始化程序”形成对比,它会尽可能早地完成它,就像在 initialize 方法中一样。
您会看到此模式的其他版本,例如:
def arr
@num ||= begin
stuff = [ ]
# ...
stuff
end
end
这可以处理初始值不那么微不足道并且可能需要一些工作才能产生的情况。再说一次,它只是在第一次调用该方法时才真正生成。
Ruby 如何知道第二遍不再初始化它?很简单,到那时@num 已经被定义为某种东西了。
请注意,如果您使用的值如 false 会被评估为非真,那么 ||= 每次都会触发。 Ruby 中仅有的两个逻辑错误值是 nil 和 false,所以大多数时候这不是问题。
如果您还需要处理 false,则必须以长格式方式执行此操作:
def arr
return @num unless num.nil?
@num = false
end
有人说要添加一个类似于||= 的运算符,它只会在nil 上触发,但我认为这还没有添加到 Ruby 中。