ruby 見習い中ですが、後置き if 関して思わぬことにハマってしまいましたので情報共有します。
例1
a = 1 if true
a = 2 if false
p a
結果 => 1
このコードの動作は、つぎのように解釈できます。1行目にて a = 1 の代入が実行される。2行目にて a = 2 の代入が実行されない。その結果、1行目で代入した値が残っている。
では、このコードの代入式の右辺をカッコで囲んでみます。
例2
a = (1 if true)
a = (2 if false)
p a
結果 => nil
実行結果が例1と異なることが分かります。
これは、つぎのように解釈できます。1行目にて (1 if true) を評価した値 1 が a に代入される。2行目にて (2 if false) を評価した値 nil が a に代入される。その結果、nil になった。
つぎに、if より前の部分をカッコで囲んでみます。
例3
(a = 1) if true
(a = 2) if false
p a
結果 => 1
今度は例1と同じになりました。つまり、ruby は「a = 2 if false」を代入式「a = (2 if false)」ではなく if 式「(a = 2) if false」として解釈していることに注意が必要です。
ではつぎはどうでしょうか?
例4
a = if true then 1 end
a = if false then 2 end
p a
結果 => nil
これは「代入式」として解釈されています。つまり、以下と同じです。
a = (if true then 1 end)
a = (if false then 2 end)
後置きの if を使うときは、このあたりのことを理解しておかないと思わぬ結果になることがあるので注意が必要です。