TIL:CRuby 右代入でのアレコレ

右代入

masterに現在導入されているシンタックスで、その名の通り左から右へと値を代入することができる。

例えばこんな感じのコードが書ける。

:hoge => temp
# temp に:hoge が代入される

Railsなどでメソッドチェーンがかなり長くなった時とかに便利そうという話はチケットに出てた。

bugs.ruby-lang.org


たぶんこんな感じでコードを書けるのでうれしいって話

User.first.name => current_user_name
# current_user_name にユーザーの名前が代入される

あとはこんな感じでifの分岐結果を受け取れるので読みやすいよねとか

if flag
  42
else
  21
end => result
# ifの結果がresultに代入される

意外と使いどころはありそうな感じ

遊んでみた

ためしにputsに渡したときにどうなるのかやってみた

puts :hoge => args
# イメージとしては puts args = :hoge

結果としてはName Errorが発生した。
どうやら:hoge => argsをハッシュとしてパースするためエラーになる模様

なので、()で括ると動くようになる。

puts (:hoge => args)
#=> hoge

これは(:hoge => args)を優先するためargs = :hogeと同じ式となるため

また以下のケースでも動作する

args = nil
puts :hoge => args
#=> {:hoge => nil}

これは:hoge => args{:hoge => nil}となるため

なので、中途半端に動作するコードとか起きそうなので初学者の人混乱するかもしれないな……

結論

右代入で変数に値を渡して、メソッドに引数として渡す場合は( )で括ること

あと引数がHashとしてパースされるので注意が必要