是否有可能实现??在操作者的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

其他提示

在红宝石,短路布尔运算符(||&&andor)不返回truefalse,而是确定整个表达的结果的第一个操作数。这工作,因为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 :)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top