Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

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

||

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