Rya*_*yan 36 ruby operators null-coalescing-operator
有可能实现?? ?? Ruby中的运算符?
a = nil
b = 1
x = a ?? b # x should == 1
x = b ?? 2 # x should == 1
Run Code Online (Sandbox Code Playgroud)
Jör*_*tag 48
在Ruby,短路布尔运算符(||,&&,and和or)不返回true或false,而是确定整个表达的结果的第一个操作数.这是有效的,因为Ruby有一个相当简单的真理概念.或者更确切地说,它有一个相当简单的虚假概念:nil是错误的,显然false是错误的.其他一切都是真的.
因此,||当至少有一个操作数为真,并且操作数从左到右进行计算时,这是真的,这意味着a || b返回a,当a为真时.但是当a错误时,表达式的结果完全依赖于b,因此b被返回.
这意味着,因为它nil是假的,你可以使用||而不是??你给出的例子.(还有一个漂亮的a ||= b操作符,哪种类似a || a = b,但不完全.)
但是,这只能起作用,因为你的示例中没有使用布尔值.如果您希望处理布尔值,那将无效:
b = false
x = b || 2 # x should be == false, but will be 2
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您将必须使用#nil?和条件表达式:
b = false
x = unless b.nil? then b else 2 end # x should be == 2
Run Code Online (Sandbox Code Playgroud)
或使用三元条件运算符:
b = false
x = b.nil? ? 2 : b # x should be == false
Run Code Online (Sandbox Code Playgroud)
如果你愿意,你可以用一个很好的方法包装它:
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
Run Code Online (Sandbox Code Playgroud)
这个可爱的片段由多态性,公开课和事实带给你nil实际上是一个对象代表虚无(不像,说,爪哇,那里null 是实际上没有).
jon*_*nii 35
您正在寻找条件分配:
a ||= b # Assign if a isn't already set
Run Code Online (Sandbox Code Playgroud)
和|| 操作者
a = b || 2 # Assign if b is assigned, or assign 2
Run Code Online (Sandbox Code Playgroud)
x = b || 2
Run Code Online (Sandbox Code Playgroud)
它(??在C#中)称为合并运算符.