1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

if文の条件部分で代入式があるけど?

Posted at

はじめに

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は nilfalse 以外は真と評価されます

以下のコードにて1の値を代入されたaという変数をif文の条件部分でbに代入します。
変数b1が代入された結果、Rubyではnilとfalse以外は真のため、
「bの値にnilやfalse以外の値が代入された」 が出力されます。

a = 1
if (b = a)
    puts 'bの値にnilやfalse以外の値が代入された'
else 
    puts 'bの値にnilやfalseが代入された'
end
# 出力:'bの値にnilやfalse以外の値が代入された'

変数anilまたは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]) で書かれている意味、そういえばどんなだっけ :sweat_drops:
と思い調べましたが、知らないことだったので調べてよかったです。

if (代入式) があればif文では代入した結果で評価していることがわかりました。

1
2
0

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
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?