を実装することは可能ですか?? Rubyの演算子?
a = nil
b = 1
x = a ?? b # x should == 1
x = b ?? 2 # x should == 1
を実装することは可能ですか?? Rubyの演算子?
a = nil
b = 1
x = a ?? b # x should == 1
x = b ?? 2 # x should == 1
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
条件付き割り当てを探しています:
a ||= b # Assign if a isn't already set
と|| オペレーター
a = b || 2 # Assign if b is assigned, or assign 2
x = b || 2
( ??C# では) 合体演算子と呼ばれます。