Rubyのクラス

少しずつクラスについて考えてみる。

インスタンスの所属クラスを調べる。

p 2.class #=> Integer
p "2".class #=> String


演算子+をメソッド風に書いてみる。
インスタンス.メソッド(引数)

p 2.+(3) #=> 5
p "2".+("3") #=> "23"

ちゃんと答えが返ってくる。

レシーバーのクラスによって+の役割が変わる(決まる)。オブジェクトの振る舞いが変わる(決まる)。
+の場合、レシーバーがIntegerクラスの時は足し算をするしStringクラスの時は連結をする。

クラスが合っていないとTypeErrorが出る。

p 2.+("3")

エラー表示

TypeError: String can't be coerced into Integer
    from (irb):5:in`+'


p "3".+(2)

エラー表示

TypeError: no implicit conversion of Integer into String
    from (irb):13:in `+'


表現は違うけれど、どちらもレシーバーに対して引数のクラスが間違っている、といったエラーが出る。


ちなみに、

p 3.1 .class #=> Float
p 2.+(3.1) #=> 5.1

のようにInteger + Floatはちゃんと答えが返ってくる。

FloatとIntegerのスーパークラスを調べてみる。

p Float.ancestors
#=> [Float, Numeric, Comparable, Object, Kernel, BasicObject]


p Integer.ancestors
#=> [Integer, Numeric, Comparable, Object, Kernel, BasicObject]


足し算としての+はNumericクラスに定義されているのかな。


Ruby 2.4.1p111