C# ??运营商在Ruby中?
-
11-09-2019 - |
题
是否有可能实现??在操作者的Ruby?
a = nil
b = 1
x = a ?? b # x should == 1
x = b ?? 2 # x should == 1
解决方案
您正在寻找有条件分配:
a ||= b # Assign if a isn't already set
和||操作
a = b || 2 # Assign if b is assigned, or assign 2
其他提示
在红宝石,短路布尔运算符(||
,&&
,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
在这种情况下,你将不得不使用#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
实际上是一个对象,带给你这个可爱的片段的代表虚无的(不像,说,爪哇,其中null
的是的实际没有)。
x = b || 2
有(??
在C#)被称为聚结操作。
有是聚结的宝石,这是接近你会得到。
nil || 5 # => 5
false || 5 # => 5 :(
false._? 5 # => false :)
不隶属于 StackOverflow