はじめに
Railsチュートリアル でRailsの学習をしている中で
気になった箇所があったので知識整理も兼ねて調べた内容をまとめます。
if文の条件で代入してる
以下のコードにてif文の条件部分にてある変数に代入している箇所がありました。
元々は session[:user_id] が存在すれ真の判定、存在しなければ偽の判定でした。
if (user_id = session[:user_id])
@current_user ||= User.find_by(id: user_id)
elsif (user_id = cookies.encrypted[:user_id])
user = User.find_by(id: user_id)
:
end
# 元々は以下のコードだった
# if session[:user_id]
# @current_user ||= User.find_by(id: session[:user_id])
# elsif cookies.encrypted[:user_id]
# user = User.find_by(id: cookies.encrypted[:user_id])
# :
# end
ですが、sessionメソッドやcookiesメソッドそれぞれ2回ずつ使用されていて、
処理が重複していまっているため、下記のような書き方で重複を避けています。
if (user_id = session[:user_id])
あまり、見慣れない書き方だったのですが、
他の言語でもこのような書き方ができるみたいで言語によってはあまり推奨されていなかったりします。
(恥ずかしながら、Javaでも書ける知らなかった…)
どうやって評価しているのか?
改めて、if文の条件の中では比較を行っているのではなく、代入を行っています。
ですが、代入を評価しているのではなく
代入した結果ユーザーIDが存在するかどうかを評価しています。
先ほどのコードを言葉にすると以下になるようです。
「ユーザーIDにユーザーIDのセッションを代入した結果、ユーザーIDのセッションが存在すれば」
引用:Railsチュートリアル
簡易的に実演してみる
簡易的にしてわかりやすくしてみました。
Rubyの真偽評価の前提としては以下があります。
Rubyは nil
や false
以外は真と評価されます
以下のコードにて1
の値を代入されたa
という変数をif文の条件部分でb
に代入します。
変数b
に1
が代入された結果、Rubyではnilとfalse以外は真のため、
「bの値にnilやfalse以外の値が代入された」 が出力されます。
a = 1
if (b = a)
puts 'bの値にnilやfalse以外の値が代入された'
else
puts 'bの値にnilやfalseが代入された'
end
# 出力:'bの値にnilやfalse以外の値が代入された'
変数a
にnil
またはfalse
を代入すれば、偽の判定になります。
a = nil # またはfalse
if (b = a)
puts 'bの値にnilやfalse以外の値が代入された'
else
puts 'bの値にnilやfalseが代入された'
end
# 出力:'bの値にnilやfalseが代入された'
おわりに
if (user_id = session[:user_id])
で書かれている意味、そういえばどんなだっけ
と思い調べましたが、知らないことだったので調べてよかったです。
if (代入式)
があればif文では代入した結果で評価していることがわかりました。