脳汁portal

アメリカ在住(だった)新米エンジニアがその日学んだIT知識を書き綴るブログ

Rubyの後置ifで変数宣言して代入しても処理では使えない

なんか勘違いしてた
後置ifでなんらかの処理の結果がかえってきたら(nilじゃなかったら)さらにその返り値に対して処理をしたいとき、
後置ifで代入してそのまま処理すれば1行でいけると思いきやいけなかった

1. 後置ifの結果がfalseの場合は処理が呼ばれないのでOK(warningは出るけど)

> puts foo
Traceback (most recent call last):
        2: from /usr/local/bin/irb:11:in '<main>'
        1: from (irb):1
NameError (undefined local variable or method 'foo' for main:Object)

> puts foo if foo = nil
(irb):2: warning: found = in conditional, should be ==
=> nil

2. 後置ifの結果がtrueになる場合はダメ

> puts bar
Traceback (most recent call last):
        2: from /usr/local/bin/irb:11:in '<main>'
        1: from (irb):1
NameError (undefined local variable or method 'bar' for main:Object)

> puts bar if bar = 'hogehoge'
(irb):2: warning: found = in conditional, should be ==
Traceback (most recent call last):
        2: from /usr/local/bin/irb:11:in '<main>'
        1: from (irb):2
NameError (undefined local variable or method 'bar' for main:Object)

後置ifで先に判定してるからいけるかと思ったんだけど、式判定的には左から判定されるのでUndefinedエラーになってしまう

後置ifを使わなければいける

> puts foobar
Traceback (most recent call last):
        2: from /usr/local/bin/irb:11:in '<main>'
        1: from (irb):1
NameError (undefined local variable or method 'foobar' for main:Object)

> if foobar = 'hogehoge'
>   puts foobar
> end
(irb):2: warning: found = in conditional, should be ==
hogehoge
=> nil