【发布时间】:2010-10-31 11:50:09
【问题描述】:
是否可以实施? Ruby 中的运算符?
a = nil
b = 1
x = a ?? b # x should == 1
x = b ?? 2 # x should == 1
【问题讨论】:
标签: ruby operators null-coalescing-operator
是否可以实施? Ruby 中的运算符?
a = nil
b = 1
x = a ?? b # x should == 1
x = b ?? 2 # x should == 1
【问题讨论】:
标签: ruby operators null-coalescing-operator
coalesce gem 离你最近的地方。
nil || 5 # => 5
false || 5 # => 5 :(
false._? 5 # => false :)
【讨论】:
x = b || 2
它(C# 中的??)称为合并运算符。
【讨论】:
在 Ruby 中,短路布尔运算符(||、&&、and 和 or)不返回 true 或 false,而是返回确定结果的第一个操作数整个表达式。这行得通,因为 Ruby 有一个相当简单的真理概念。或者更确切地说,它有一个相当简单的虚假概念:nil 是虚假的,显然false 是虚假的。 其他的一切都是真的。
所以,由于|| 在其至少一个 操作数为真时为真,并且操作数从左到右计算,这意味着a || b 返回a,当@ 987654333@ 是真的。但是当a为假时,表达式的结果只依赖于b,从而返回b。
这意味着,因为nil 为假,您可以只使用|| 而不是?? 作为您提供的示例。 (还有漂亮的a ||= b 运算符,类似于a || a = b,但不完全一样。)
但是,only 有效,因为您没有在示例中使用布尔值。如果您希望处理布尔值,那将是行不通的:
b = false
x = b || 2 # x should be == false, but will be 2
在这种情况下,您将不得不使用#nil? 和一个条件表达式:
b = false
x = unless b.nil? then b else 2 end # x should be == 2
或使用三元条件运算符:
b = false
x = b.nil? ? 2 : b # x should be == false
如果你愿意,你可以用一个很好的方法把它包装起来:
class Object
def _? b = nil
return self
end
end
class NilClass
def _? b = nil
return yield if block_given?
return b
end
end
b = false
x = b._? { 2 } # x should be == false
x = b._? 2 # x should be == false
这个可爱的 sn-p 是由多态性、开放类和 nil 实际上是一个代表虚无的对象这一事实带来的(不像,比如说,Java,null 实际上什么都没有)。
【讨论】:
a ||= b 与其说是“某种”a || a = b,倒不如说是a = a || b。不是条件赋值,赋值总会发生。
您正在寻找条件赋值:
a ||= b # Assign if a isn't already set
和 ||运营商
a = b || 2 # Assign if b is assigned, or assign 2
【讨论】: