Rubyで変数に値が格納されていない状態はnilですが、nilに対する処理を記述するためにRuby on Railsのtry!メソッドを使えるのをご存じでしょうか。try!メソッドを使えば変数がnilの場合に処理するメソッドをシンプルに記述できます。
さらにRubyには標準で使えるボッチ演算子「&.」があり、この機能はtry!メソッドとです。今回はRuby on Railsのtry!メソッドとボッチ演算子「&.」の機能とその使い方について紹介します。
try!メソッドはNull条件演算子
Ruby on Railsにはnilを判定する処理をシンプルに記述できるtry!メソッドを使えるのをご存じでしょうか。Rubyは短く読みやすいプログラム言語ですが、nilの扱いに注意が必要です。
そしてtry!メソッドを使うことで、そのような注意が必要なnilを含む変数を対象に、引数で指定したメソッドを安全に実行できます。
なおtry!メソッドはRubyだけの機能ではありません。try!メソッドと同じような機能が、他のプログラムでも使えます。そしてこのような機能は、Null条件演算子と呼ばれます。try!メソッドの機能や使い方を解説する前に、Null条件演算子について紹介します。
Rubyにとってnilは特別
変数に何も格納されていない状態は、Rubyではnil、他のプログラム言語ではnullで表現されます。
なおRubyでは、変数にオブジェクトが代入されると、その代入されたオブジェクトが所属するクラスの変数となり、同じクラスのメソッドが利用可能です。しかし、変数に何も無いのではクラスが決まりません。そして異なるクラスのメソッドを実行しようとするとエラーが発生します。
Rubyにはnil?メソッドがあり、オブジェクトがnilかどうかをチェックできます。しかし、もっと読みやすい書き方が可能です。それがNull条件演算子です。
Null条件演算子とは
Null条件演算子とは、変数がnullでない場合に演算子に続いて記述するメソッドの結果を返し、そうでない場合にnullを返す演算子です。そしてRuby on Railsのtry!メソッドは、Ruby on RailsにおけるNull条件演算子として実装されました。
Null条件演算子の基本
変数 Null条件演算子 メソッド
Null条件演算子の演算結果は次のとおりです。
null = null Null条件演算子 メソッド
メソッドの結果 = nullではない Null条件演算子 メソッド
try!メソッドとボッチ演算子の関係
先ほどtry!メソッドはRuby on Railsに実装されたNull条件演算子と紹介しましたが、実際に使えるようになったのは2009年にリリースされたRuby on Railsバージョン2.3.2からです。
Rubyにはtry!メソッドと同じ機能のボッチ演算子もあります。これはは、2015年にリリースされたRubyバージョン2.3から実装されました。このように先にRuby on Railsで使えるようになったtry!メソッドが便利なので、Rubyでも使えるようにしたのがボッチ演算子です。
try!メソッドとボッチ演算子「&.」の使い方
try!メソッドは先ほど紹介したように対象のオブジェクトがnilの場合、メソッドの実行を回避するための仕組みです。そしてボッチ演算子としてRuby on Railsでしか使えなかったtry!メソッドと同じ機能をRubyの標準の機能として取り入れました。
次からtry!メソッドと同じ機能のボッチ演算子「&.」と使い方を紹介します。
try!メソッドの使い方
try!メソッドは、オブジェクトがnilの場合にnilを返し、メソッドが定義されている場合はそのメソットを処理した結果を、またメソッドが定義されていない場合は例外が発生させます。
つまりオブジェクトがnilの場合、nilを対象に取れないメソッドを実行して発生するエラーを避けられます。ただし、オブジェクトがnilでなくてもエラーが発生する可能性がある場合は、それ例外を処理する仕組みも必要です。
try!メソッドの使い方
オブジェクト.try!(:メソッド)
tyr!()の引数でメソッドを指定する場合、「:」を付けてください。
try!メソッドの使用例
name = article.try!(:author)
この例は、もしオブジェクトarticleがnilでなければarticle.authorの結果をnameに代入し、articleがnilならnameにnilを代入します。
Rubyでは次のようにtry!メソッドを続けて記述することも可能です。
name = article.try(:author).try(:name)
ボッチ演算子「&.」の使い方
try!メソッドはRuby on Railsでしか使えませんが、ボッチ演算子「&.」は標準で利用できます。そしてその使い方は、try!メソッドと基本的に同じです。
ボッチ演算子「&.」の使い方
オブジェクト&.メソッド
ボッチ演算子「&.」の使用例
name = article&.author
この例は、先ほど紹介したtry!めっそっどの例と同じで、もしオブジェクトarticleがnilでなければarticle.authorの結果をnameに代入し、articleがnilならnameにnilを代入します。
またボッチ演算子を続けて記述することも可能です。
name = article&.author&.name
tryメソッドボッチ演算子は取り扱い注意
Ruby on Railsにはtry!メソッドと同じような機能で「!」が付かないtryメソッドもあります。tryメソッドの機能は、オブジェクトがnilの時やメソッドが定義されていない場合はnilを返し、メソッドが定義されている場合はそのメソットを呼び出します。
tryメソッドの使い方
オブジェクト.try(メソッド)
tyr()の引数でメソッドを指定する場合、「:」を付けてください。
tryメソッドの使用例
name = article.try(:author)
ただしtry演算子はメソッドを間違えていてもエラーにならずにnilを返すので、プログラムミスを見逃すこともあります。使う際には注意が必要です。
どちらを使うべき?
これまで何度か紹介しているようにRuby on Railsのtry!メソッドとボッチ演算子「&.」は同じ機能です。ではどちらを使えばいいでしょうか。
特にプログラム記述ルール等で指定がなければ、処理速度が速く、よりシンプルに記述できうるボッチ演算子「&.」の利用をおすすめします。
try!メソッドとボッチ演算子「&.」の使用例
今回紹介しているtyr!メソッドとボッチ演算子「&.」は、オブジェクトがnilかどうかをチェックするnil?を使ったプログラムをシンプルに書き換えることが可能です。
次からRuby on Railsのtry!メソッドの使用例を紹介します。
nil?メソッドの処理を置き換える
try!メソッドを使えば、nil?メソッドを使った処理を1行だけでのシンプルなプログラムに置き換えることが可能です。
例えば、オブジェクトtargetをnil?メソッドでチェックし、もしnilでない場合にto_iメソッドで数字に変換するif構文を使ったプログラムがあったとします。
nil?を使ったプログラムの例
if target.nil? then out = nil else out = target.to_i end
このプログラムをRuby on Railsのtyr!メソッドで書き換えると、次のようにシンプルに記述できます。
try!メソッドを使ったプログラムの例
out = target.try!(:to_i)
ボッチ演算子「&.」で置き換える
先ほどの例はtry!メソッドと同じ機能のボッチ演算子「&.」でも置き換えられます。同じように1行のシンプルなプログラムに書き換えられ、さらにRuby on Railsでなくても使えるので、ぜひ活用してください。
nil?を使ったプログラムの例
if target.nil? then out = nil else out = target.to_i end
ボッチ演算子「&.」を使ったプログラムの例
out = target&.to_i
まとめ
これまで紹介したようにRuby on Railsのtry!メソッドを利用することで、オブジェクトがnilの場合の処理をシンプルに記述できます。また、Rubyのバージョン2.3以降にはtry!メソッドと同じ機能のボッチ演算子「&.」が実装されています。
ボッチ演算子「&.」はRuby on Rails以外のRubyのプログラムでも使えて処理も高速なので、特に指定が無い場合はRuby on Railsでもボッチ演算子「&.」を利用してください。