Rubyで使われる演算子「||=」の謎

Rubyで使われる演算子「||=」の謎

こんにちは、新人の意識高丸です。
昨日も元気にRuby勉強会に参加してきました。

初心者向けRuby勉強会「gaienrb」
http://www.circleaf.com/groups/13

本日はRailsチュートリアルの8章を進めていきました。
この章では、ユーザのログインやログアウトの仕組みを実装しています。

よくある自動ログインのような機能を以下のように実装しました。

1.RailsのSecureRandomモジュールにあるurlsafe_base64メソッドを使ってユーザ識別用のトークンを生成する
2,ログイン時ブラウザにトークンを保存し、データベースにはトークンを暗号化したものを保存する
3.自動ログインの際にはブラウザに保存したトークンを暗号化し、DBのトークンと比較して該当するものがあった場合、対応するユーザとしてログイン済みとしています

DBに保存するトークンを暗号化するのは、DBの中が不正にアクセスされた際に攻撃者がトークンを使用してログインできないようにするためのようです
セキュリティのことを考えるのであれば、トークン自体をセッションごとに再作成すればより安全になるとも書いてありました。

自動ログインの仕組みは実際の開発で作る機会がありそうなので覚えておこうと思います。
ちなみに、今回トークンを生成する際に使用したSecureRandomというモジュールにはユニークなIDを生成するuuidメソッドなど便利なものがありました。
これも使う機会がありそうです。

それと、8章の中ではRubyでよく見かける「||=」について触れていました。
Rubyでは「||=」の演算子を使うと、左辺がnilの時のみ(厳密にはfalseもだと思いますが)代入するということが出来ます。

下の例のように、左辺がnilの場合は代入されます

“`左辺がnilの場合
2.0.0p247 :001 > name = nil
=> nil
2.0.0p247 :002 > name_jp = “Taro”
=> “Taro”
2.0.0p247 :003 > name ||= name_jp
=> “Taro”
2.0.0p247 :004 >
“`

“`左辺がnilでない場合
2.0.0p247 :001 > name = “JIRO”
=> “JIRO”
2.0.0p247 :002 > name_jp = “Taro”
=> “Taro”
2.0.0p247 :003 > name ||= name_jp
=> “JIRO”
2.0.0p247 :004 >
“`

この A ||= B という式は、以下のように分解できます。
A = A || B

Rubyでは、nilとfalse以外はすべて真になり、さらに||演算子を使った場合はtrueやfalseが返るのではなく、評価された値が返却されるうえに、左から評価をしていって真になった時点で評価をやめます

下の例の場合、first_nameは”TARO”という文字列で真なので、左辺に”TARO”が代入されて次のlast_nameは評価されません

“`||で代入
2.0.0p247 :001 > first_name = “TARO”
=> “TARO”
2.0.0p247 :002 > last_name = “YAMADA”
=> “YAMADA”
2.0.0p247 :003 > name = first_name || last_name
=> “TARO”
“`

下の例の場合は最初の評価であるfirst_nameがnilで偽なので、次のlast_nameが評価されて代入されます

“`最初の値がnilで偽の場合
2.0.0p247 :001 > first_name = nil
=> nil
2.0.0p247 :002 > last_name = “YAMADA”
=> “YAMADA”
2.0.0p247 :003 > name = first_name || last_name
=> “YAMADA”
“`

||=というのは、Rubyのこういった評価の性質を利用して行っているということだと思います。

まだまだ奥が深いので、基礎をしっかりと勉強していきたいと思います。

TAG

  • このエントリーをはてなブックマークに追加
意識 高丸
エンジニア 意識 高丸 takamaru

Rubyについて日々勉強している新人エンジニアです。初心者向けRuby勉強会のレポートなどを投稿していきます。