C#?? Rubyの演算子?

概要

実装することは可能でしょうか?? Rubyの演算子?

a = nil
b = 1

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

解決策

Ruby では、短絡ブール演算子 (||、&&、および or) は true または false を返しませんが、式全体の結果を決定する最初のオペランドを返します。 Ruby は真実についてかなり単純な考えを持っているため、これは機能します。というか、偽についてかなり単純な考え方を持っています。nil は偽であり、明らかに false は偽です。それ以外はすべて真実です。

|| 以来、オペランドの少なくとも 1 つが true で、オペランドが左から右に評価される場合、これは || が true であることを意味します。 a が true の場合、b は a を返します。ただし、a が false の場合、式の結果は b のみに依存するため、b が返されます。

つまり、nil は false であるため、 || を使用することができます。の代わりに ??あなたが挙げた例については。 (気の利いた 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 が実際には何もない Java とは異なります)。