dogwood008の開発メモ!

最近のマイブームは機械学習, Ruby on Rails。中でも機械学習を使った金融商品の自動取引に興味があります。

【Ruby】Nillableな変数を引数として受け得るなら、Object#to_sしておけば色々と便利

概要

変数に対してメソッドチェインの途中で String#capitalize 等の String クラスのメソッドが挟まる場合、変数の初期段階で Object#to_s を読んでおくと不用意に Nil#some_method が出てしまうことを回避できる。

詳細

Object#to_s は、 Objectnil の場合、 '' を返す。

Rubyでは(Rubyに限らないが)、メソッドチェインを使用して、複数のメソッドを連続で呼ぶ事がよくある。この時、 String#capitalize 等のStringクラスのメソッドをチェインする場合、チェイン途中に nil が居ると都合が悪い。つまり、 Nil#some_method を呼び出そうとして、 NoMethodError が出てしまうのである。

これを避けるため、変数に対して希望のメソッドを呼ぶ前に、 Object#to_s を読んでおくと、 Objectnil だった場合に '' が返るため、 Nil#some_method を呼び出してしまって NoMethodError にぶつかってしまうことを避けられる。

具体例

下記の例を考えてみる。

params[:given_name].capitalize

params[:given_name]Stringが入っていれば何の問題も無いが、nil の場合は前述の通り NoMethodError になってしまう。これはこのように書き換えるのがおすすめである。

params[:given_name].to_s.capitalize

注意

目的に応じて、本当に Object#to_s して良いかは各自で判断する必要がある。場合によっては、 NoMethodError で落とした方が間違いに気づけて良い場合もある。