C# ??Ruby中的运算符?

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,短路布尔运算符(||,&&,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
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 实际上没有).

  • @Theo:这就是ISO Ruby语言规范的当前草案所说的,但这是错误的.MRI,YARV,JRuby,Rubinius,XRuby,MacRuby,IronRuby,Ruby.NET,MagLev,SmallRuby,tinyrb,RubyGoLightly以及所有其他Ruby实现,都将其实现为短路条件赋值.Ruby编程语言(由matz自己编写),编程Ruby和所有其他Ruby书籍都以这种方式记录.RubySpec测试套件以这种方式进行测试.关于StackOverflow的几个讨论和关于ruby-talk的几十个讨论都这么说.马茨亲自这么说. (5认同)

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)

  • 由于我在答案中概述的原因,这不起作用.尝试在第一个示例中将a设置为false,或者在第二个示例中将b设置为false. (9认同)

Chr*_*heD 5

x = b || 2
Run Code Online (Sandbox Code Playgroud)

它(??在C#中)称为合并运算符.

  • 由于我在答案中概述的原因,这不起作用.尝试在示例中将b设置为false. (2认同)