是否可以实现 ?? Ruby 中的运算符?
a = nil
b = 1
x = a ?? b # x should == 1
x = b ?? 2 # x should == 1
最佳答案
在 Ruby 中,短路 bool 运算符(||
、&&
、and
和 or
)不返回 true
或 false
,而是返回决定整个表达式结果的第一个操作数。这是可行的,因为 Ruby 有一个相当简单的真值概念。或者更确切地说,它有一个相当简单的错误概念:nil
是错误的,显然 false
是错误的。 其他一切都是真的。
因此,由于 ||
在其操作数中至少一个 为真时为真,并且操作数是从左到右求值的,这意味着 a || b
返回 a
,当 a
为真时。但是当 a
为假时,表达式的结果完全取决于 b
,因此返回 b
。
这意味着,因为 nil
是假的,你可以只使用 ||
而不是 ??
你给的例子。 (还有漂亮的 a ||= b
运算符,其工作方式类似于 a || a = b
,但不完全相同。)
但是,仅 有效,因为您没有在示例中使用 bool 值。如果您希望处理 bool 值,那是行不通的:
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
多态性、开放类以及 nil
实际上是一个代表虚无的对象(不像 Java,其中 null
是实际上什么都没有)。
关于ruby - C# ?? Ruby 中的运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/953216/