LoginSignup
2
2

More than 5 years have passed since last update.

三項演算子 理解に苦労したお話

Last updated at Posted at 2017-11-17

概要:三項演算子での記述でつまずいた点を記述する。

  • 三項演算子を使用して修正を依頼されたコードの意味が理解できない。

修正前のコード

tops_controller.rb
  def set_varriable
    @language = params[:la]
    action = params[:action]
    return render "tops/en/#{action}" if @language.try(:include?, 'en')
    render :"#{action}"
  end

viewから送られてくるparams[:la]を判断してparams[:la]が'en'を含んでいればrenderで"tops/en/#{action}"に遷移する。
それ以外の場合はrenderで"#{action}"に遷移するという内容であった。
しかし@language.try(:include?, 'en') と書くより @language == 'en'で判断した方がいいということで下記三項演算子での記述に変更することになった。

@language = params[:la] ? params[:la] : 'ja'

ここで疑問が。。。三項演算子って私の認識ではこうだったんです。

条件式 ? 真の時の値 : 偽の時の値

上記の書き方は@language = params[:la]の部分が果たして条件式なのだろうか???
(正確にはparams[:la]のみが条件式 ↓下記コメント参照)

困ったのでrails consoleで確認する。

terminal
[1] pry(main)> @language = nil ? 'en' : 'ja'
=> "ja"
[2] pry(main)> @language = nil ? 'ja' : 'en'
=> "en"
[3] pry(main)> @language = true ? 'en' : 'ja'
=> "en"
[4] pry(main)> @language = false ? 'en' : 'ja'
=> "ja"

なるほど、続いて下記を実行する

terminal
[5] pry(main)> params = {:la=>"en"}
=> {:la=>"en"}
[6] pry(main)> @language = params[:la] ? params[:la] : 'ja'
=> "en"
[7] pry(main)> params = {:la => nil}
=> {:la=>nil}
[8] pry(main)> @language = params[:la] ? params[:la] : 'ja'
=> "ja"
[9] pry(main)> 

なるほど、なるほど。
つまりはこういうことだったのか。
@language = params[:la]存在すれば真を返す。
@language = params[:la]存在しなければ偽を返す。
左辺はこれだけで条件式として見なされるのだ。

修正後のコード

tops_controller.rb
  def set_varriable
    @language = params[:la] ? params[:la] : 'ja'
    action = params[:action]
    return render "tops/en/#{action}" if @language == 'en'
    render :"#{action}"
  end

renderの条件が@language == 'en'で表されシンプルになった。

2
2
10

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