私はRubyが初めてです。
||
とはどう違い||=
ますか?
>> a = 6 || 4
=> 6
>> a ||= 6
=> 6
それらは同じように聞こえます。
x ||= y
x がnull または undefined または false の場合に割り当てることを意味y
します。へのショートカットです。x
x = y unless x
Ruby の短絡演算子
||
では、左のオペランドが true の場合、右のオペランドは評価されません。
上記の行の簡単な例を次に示します||=
。
x が未定義で n が の場合nil
:
と
unless
y = 2
x = y unless x
x # => 2
n = nil
m = 2
n = m unless n
m # => 2
と
=||
y = 2
x ||= y
x # => 2
n = nil
m = 2
n ||= m
m # => 2
||=
左辺の値が偽の場合にのみ、左辺の値を右辺の値に設定します。
この場合、6 と 4 の両方が真であるため、 は最初の真の値である にa = 6 || 4
設定されます。a
6
a ||= 6
a
が偽の場合にのみ 6に設定されa
ます。つまり、nil または false の場合です。
a = nil
a ||= 6
a ||= 4
a # => 6
||= 6 は、まだ割り当てられていない場合にのみ 6 を割り当てます。(実際、クリスが言ったように、間違っています)
a = 4 ||= 6 => 4 = 4 || 6 => 4
a ||= 6
のように展開できます。
a || a = 6
a
したがって、a
is notnil
またはを使用することがわかります。false
それ以外の場合は、に値を割り当てa
てその値を返します。これは、値のメモ化によく使用されます。
アップデート
||=
(または等しい)演算子の真の展開を指摘してくれた最初のコメントに感謝します。私は何か新しいことを学び、それについて話しているこの興味深い投稿を見つけました. http://dablog.rubypal.com/2008/3/25/a-short-circuit-edge-case
どちらの式も同じ結果a = 6 || 4
をa ||= 6
返しますが、違いは、||=
この変数が nil または false の場合に変数に値を代入することです。