項目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つのモデル鳴くメソッドを用意するとそれぞれのインターフェースを用いて利用できる。