を実装することは可能ですか?? 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はかなり単純な真実の考えを持っているので、これは機能します。むしろ、それは虚偽のかなり単純な考えを持っています:偽であり、明らかに偽です。他のすべては真実です。&&
and
or
true
false
nil
false
したがって、オペランドの少なくとも1つ||
がtrueの場合はtrueであり、オペランドは左から右に評価されるため、 trueの場合はを返します。ただし、がfalseの場合、式の結果はにのみ依存するため、が返されます。a || b
a
a
a
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
オブジェクトであるという事実によってもたらされます(たとえば、実際には何もない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# では) 合体演算子と呼ばれます。