ruby - C# ?? Ruby 中的运算符?

标签 ruby operators null-coalescing-operator

是否可以实现 ?? Ruby 中的运算符?

a = nil
b = 1

x = a ?? b # x should == 1
x = b ?? 2 # x should == 1

最佳答案

在 Ruby 中,短路 bool 运算符(||&&andor)不返回 truefalse,而是返回决定整个表达式结果的第一个操作数。这是可行的,因为 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/

相关文章:

javascript - JavaScript 中的 Rails 哈希,访问值

c# - 如果空合并操作中的所有参数都为空,结果会怎样?

C# null 合并运算符等效于 c++

ruby-on-rails - 各按惯例

ruby - 安装 cocoapods 时出错

c++ - 在 C++ 中,我可以使用箭头运算符访问另一个运算符吗?

c++ - 重载赋值运算符 : different datatypes - impossible?

c++ - 位操作 : Similar operation results in different results

c# - 在可空类型上使用合并空运算符会更改隐式类型

ruby-on-rails - 安装rails报错: Operation not permitted