Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

「||=」や「&&=」の挙動

||

Kernel.puts 'odd' || val.odd?

これは

Kernel.puts 'odd' if val.odd?

と同じ意味です。

値が設定されていない場合、初期値を設定する能力もあります。

Kernel.puts hoge ||= "test"
test
=> nil

値が入っている変数に対しては何もしません。
また、空変数にメソッド付きで呼び出すとエラーを吐きます。

hoge = "test"
Kernel.puts hoge ||= hoge.upcase
#=>test

hoge = nil
Kernel.puts hoge &&= hoge.upcase
#=> NoMethodError: undefined method `upcase' for nil:NilClass

&&

> i.even? && Kernel.puts('even')
#=> false

これは頭から解釈されます。
最初の式で弾かれたらそこで停止します。

先ほどとは違い、指定されたモノで上書きされます。

> Kernel.puts hoge &&= "ge"
ge
=> nil

値の設定についても、上書きして実行します。
また、空変数はnilを返してくれる仕様です。
流石に違うクラスを指定すると読んでくれませんが

hoge = "test"
=> "test"
Kernel.puts hoge &&= hoge.upcase
#=>TEST

hoge = nil
Kernel.puts hoge &&= hoge.upcase
#=> 

hoge = 1
Kernel.puts hoge &&= hoge.upcase

#=>NoMethodError: undefined method `upcase' for 1:Fixnum