12
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ruby の後置き if に注意

Posted at

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 を使うときは、このあたりのことを理解しておかないと思わぬ結果になることがあるので注意が必要です。

12
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?