Effective Ruby 項目2 nilかもしれない

2022.05.27

項目2 オブジェクトを扱うときはnilかもしれないと言うことを忘れないようにしよう、のまとめを書く。

rubyのnil

nil のクラス。 nil は NilClass クラスの唯一のインスタンスです。 nil は false オブジェクトとともに偽を表し、その他の全てのオブジェクトは真です。

https://docs.ruby-lang.org/ja/latest/class/NilClass.html

nil = 存在しないという意味。rubyでは””,[],0なんかは存在するとして扱われる。

nilクラス唯一のインスタンスである。言い換えるとnilクラスの素材として作られたオブジェクト。

nilに起因するエラーというのはテストをすり抜けてユーザーが本番システムで突拍子もないことをした時に起こることが多いと書いている。メソッドがnilを返しその戻り値を他のメソッドの引数として使う時にも多いという

オブジェクトのメソッドを呼び出したときに反応がなければ、実行時にrubyはNoMethodError例外を生成している。

ちなみにrubyプログラムに含まれるオブジェクトはBasicObjectクラスを継承するクラスから作られるのでnilもBasicObjectを継承してる。

ポリモーフィズム?

ダックタイピングの一種。下記コードが例。

複数のクラスがあっても出力(インターフェース)を統一して同じ呼び出しで扱えるようにしている。

personモデルを同じインターフェース(JohnnyとJun)を持ったものが扱っている。

class Person

 def initialize(tmp)
  @tmp = tmp
 end

 def from
  @tmp.country
 end
end

class Johnny
 def country
  "USA"
 end
end

class Jun
 def country
  "JAPAN"
 end
end

puts Person.new(Johnny.new).from
puts Person.new(Jun.new).from

ruby on rails では同じインターフェース(例えば話す)を持った機能を1つのモデルで実装する時に使う。

例えるとライオン、ゾウ、ゴリラに共通しているインタフェースは『鳴く』。animalていう1つのモデル鳴くメソッドを用意するとそれぞれのインターフェースを用いて利用できる。