45

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

a = nil
b = 1

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

4 に答える 4

55

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

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

つまり、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オブジェクトであるという事実によってもたらされます(たとえば、実際に何もないJavaとは異なります)。null

于 2009-06-04T22:08:32.863 に答える
36

条件付き割り当てを探しています:

a ||= b  # Assign if a isn't already set

と|| オペレーター

a = b || 2 # Assign if b is assigned, or assign 2
于 2009-06-04T21:34:36.877 に答える
3
x = b || 2

( ??C# では) 合体演算子と呼ばれます。

于 2009-06-04T21:36:10.807 に答える