42781


Ruby の以下の行の挙動が分かりません。

[code]

    a ||= b
    
[/code]

OR とイコールを合わせたような、パイプ2本とイコールから成る演算子は何ですか？  
特に、この演算子の正確な挙動が書かれたドキュメントはありませんか？


CC BY-SA 3.0
2018-03-30T06:25:33.800
42780
2018-09-19T09:39:05.703
2018-03-30T07:49:30.013
19110
19110
question
ruby
Ruby の ||= 演算子とは？


条件付きで代入する構文です。直観的には「OR‐イコール」です。

`a` が未定義であるか、`nil` または `false` であるならば `b` が代入されます。  
どれでもない場合、`a` のままです。  
[自己代入](https://docs.ruby-
lang.org/ja/latest/doc/spec=2foperator.html#selfassign)の一種になります。

### 動作例

[code]

    a ||= nil
    # => nil
    a ||= 0
    # => 0
    a ||= 42
    # => 0
    a = false
    # => false
    a ||= true
    # => true
    a ||= false
    # => true
    
[/code]

典型的には初期化に使われます。

[code]

    a = some_function()
    a ||= "デフォルトの値"
    
[/code]

### 詳細な説明

`a ||= b` は **おおまかに言うと** `a || a = b` と同じです。つまり、`a` が false や nil
でないなら[短絡評価](https://ja.wikipedia.org/wiki/%E7%9F%AD%E7%B5%A1%E8%A9%95%E4%BE%A1)されてそのままであり、false
や nil なのであれば `a = b` が実行されます。

混乱しそうになりますが、細かいことを言うと `||=` は `+=` や `*=` とは違う挙動をします。具体的には、`a += b` が `a = a +
b` と評価されるのに対し、`a ||= b` は `a || (a = b)` と評価されます。短絡評価のため、`a || (a = b)` と `a =
a || b` は異なる挙動をし得ることに注意してください。たとえばメソッドへの代入が起こるかどうかが変わります。以下は違いを知るためのサンプルコードです。

[code]

    class C
      attr_reader :x
      def x=(v)
        puts "x = #{v}"
        @x = v
      end
    end
    
    c = C.new
    c.x ||= 111
    c.x ||= 222
    
    c = C.new
    c.x = c.x || 333
    c.x = c.x || 444
    
    c = C.new
    c.x || c.x = 555
    c.x || c.x = 666
    
    # 出力:
    # x = 111
    # x = 333
    # x = 333
    # x = 555
    
[/code]

更に細かいことを言うと、`a ||= b` と `a || (a = b)` は完全に等しいわけではありません。`a` が未定義のとき、後者は
NameError を出しますが、前者は出しません。(未解決の疑問:
このあたりについて、では厳密にどのような挙動をするのか書かれた公式文書は存在するのでしょうか？)

更に更に細かい点については[このブログ記事](http://www.rubyinside.com/what-rubys-double-pipe-or-
equals-really-does-5488.html)が詳しいです。


CC BY-SA 4.0
2018-03-30T06:26:26.533
42781
2018-09-19T09:39:05.703
2018-09-19T09:39:05.703
19110
19110
42780
answer