webエンジニアの日常

RubyやPython, JSなど、IT関連の記事を書いています

Rubyをもう一歩進んで勉強する2章(nilかもしれない運転)

Effective Ruby勉強メモ第2回目です

Effective Ruby

Effective Ruby

スポンサーリンク

オブジェクトを扱うときにはnilかもしれないということを忘れないようにしよう

タイトルの通りですが、Rubyでプログラムを書いているときに最も遭遇する(遭遇した)エラーは

undefuned method 'hoge' for nil:NilClass (NoMethodError)

だと思います。

このエラーの最善の防御策は、常にレシーバがnilになるかもしれないという前提でコードを書くことです。

例えば、第1章のnil, falseだけが偽になるという性質を使うと、

user.save if user

などとすれば、まちがってuserオブジェクトがnilの場合はsaveメソッドを呼び出そうとしてエラーを引き起こしません。

同じことですが、

user.save unless user.nil?

と書いた方が、条件文で何をチェックしたいのか明示的に書かれているので可読性が増します。

あるいは、期待していた変数が文字列や整数値の場合は、nilを空文字や0に変換するという対応策も挙げられます。

to_iメソッドやto_sメソッドは、レシーバがnilの場合、それぞれ0と空文字("")を返します。

また、Arrayクラスのcompactメソッドは配列から全てのnilを排除してくれます。ループを回す前処理として入れておくといいですね。

Railsアプリ等で、必須の入力項目でないカラムに対しては、可能な限り初期値を設定しておくことはとても有効です。

感想

結果的に、nilの場合を考慮した条件分岐やコードがアプリのあちらこちらに散らばってしまいまい、きれいではありませんが、そのようなソースコードはちゃんとnilも考慮されているという安心感があります。

あらためてnilかもしれない前提でコードを書くと言われると、ハッとしますが、Railsを勉強したての頃に比べると、最近ではnilを考慮したコードをかけるようになったのかなと思います。

たのしいRuby 第5版

たのしいRuby 第5版

かんたん Ruby (プログラミングの教科書)

かんたん Ruby (プログラミングの教科書)

Effective Ruby

Effective Ruby