LoginSignup
5
5

More than 5 years have passed since last update.

if文で代入式を作るとオブジェクトがnilになってくれるらしい

Posted at

意味不明なタイトルだけど・・・

a = foo if flag
a.blanK? 'hoge' : 'fuga'

こんな感じの書き方があり、flagがfalseだった場合エラーになるんじゃね?
って思ったらならなかったのでビックリ!

何か自分が勘違いしているのかと思って、ちょっと試してみた

[6] pry(main)> class Hoge
[6] pry(main)*   def foo
[6] pry(main)*     1
[6] pry(main)*   end
[6] pry(main)*   def bar(flag)
[6] pry(main)*     b if flag
[6] pry(main)*     a = foo if flag
[6] pry(main)*     p a
[6] pry(main)*     p b
[6] pry(main)*   end
[6] pry(main)* end
=> :bar
[7] pry(main)> Hoge.new.bar true
NameError: undefined local variable or method `b' for #<Hoge:0x007f95aba2f740>
from (pry):28:in `bar'
[8] pry(main)> Hoge.new.bar false
nil
NameError: undefined local variable or method `b' for #<Hoge:0x007f95b46ef0e0>
from (pry):31:in `bar'

やっぱ宣言されずにいきなり使った b はエラーになるよね。
なのに代入で使用した a はエラーにならない

理由がわからんけど、こんなような展開が内部的にされているのかなぁ。。。

var a;
if (flag) {
  a = foo
}

全然解決してない、何の役にも立たないブログになってしまったw

5
5
6

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
5
5