Ruby超入門 2周目 CHAPTER8-3 オブジェクトが呼び出せる メソッドを作る まで

f:id:kkouji0224:20191029231558p:plain

『ゼロからわかる Ruby 超入門 (かんたんIT基礎講座) 』
github.com

 

休みなのに一日雨だったぜ!!ということで今晩は。koujiです。今日からCHAPTER8の振り返りに入っていきまーす。段々と難易度が上がっていく気がするけど余裕だぜ!

 

クラスを作る

class Drink
end
drink = Drink.new
p drink.class

 

クラスの定義の仕方はclass クラス名 endって書くとできちゃう。で、.newメソッドでDrinkクラスのオブジェクトを作って変数drinkに代入してるんだね。で、drinkにclassメソッドを呼び出してる。変数drinkはDrinkクラスのオブジェクトなのでclassメソッドを使ってみるとDrinkってクラスに属してるよーってのがわかる。

 

ちなみにクラス名の規則があるんだね。クラス名はDrinkとかAlcみたいな感じで先頭を大文字にしてあげる。2単語以上を繋げる場合は先頭と区切りの文字を大文字にしてあげる慣習があるみたい。この書き方をキャメルケースっていうのね。ラクダ書き。

 

クラスにメソッドを定義する

class Drink
    def alc
        "まずはアルコールはビールで!"
    end
end
drink = Drink.new
puts drink.alc

 

メソッドをclass Drink 〜 endの中に書いてあげるとDrinkクラスのメソッドとして定義されるんだね。クラスに定義したメソッドを呼び出してるのがdrink.alcだね。newメソッドでDrinkクラスのオブジェクトを作って、それを変数drinkに代入してる。で、そのdrinkにクラスの中で定義したalcメソッドを呼び出してる感じ。オブジェクト.メソッドって書き方だね!変数に代入されてるときは変数.メソッドだね!

 

レシーバ

メソッドを呼び出されるオブジェクトのことをレシーバって言うらしい。上の場合だと変数drinkに代入されてるDrinkクラスのオブジェクトになるね。

 

drink.alcの場合はdrinkが「レシーバ」で、alcが「メソッド」

例えば2.even?だったら2が「レシーバ」で、even?が「メソッド」

 

便利だなーと思ったのがmethodメソッド

 

p drink.methods

 

こんな感じで書いてあげるとレシーバのオブジェクトが呼び出せるメソッドがばーって表示されるんだよっ!

 

:alc, :instance_variable_defined?, :remove_instance_variable, :instance_of?, :kind_of?, :is_a?, :tap, :instance_variable_get, :instance_variable_set, :instance_variables, :protected_methods, :private_methods, :public_send, :method, :public_method, :singleton_method, :define_singleton_method, :extend, :to_enum, :enum_for, :<=>, :===, :=~, :!~, :eql?, :respond_to?, :freeze, :inspect, :object_id, :send, :to_s, :display, :class, :nil?, :hash, :dup, :singleton_class, :clone, :then, :itself, :yield_self, :untaint, :taint, :tainted?, :trust, :untrust, :untrusted?, :singleton_methods, :frozen?, :methods, :public_methods, :equal?, :!, :==, :instance_exec, :!=, :instance_eval, :__id__, :__send__]

 

こんな感じ!これは便利だよねー。さっきクラスの中で定義したメソッドのalcもちゃんと入ってるね!!

 

クラスの中に引数を受け取るメソッドを定義

class Drink
    def alc_order(name)
        puts "#{name}で乾杯だ!"
    end
end
drink = Drink.new
drink.alc_order("ワイン")

 

上の場合だとalc_orderで引数を受け取れるようにして、drink.alc_order("ワイン")でalc_orderメソッドを呼び出して引数でワインを渡してる。で、渡されたワインを変数nameに代入してる感じだね。

 

クラスの中で同じクラスの他のメソッドを呼び出す

class Drink
    def alc
        "ウーロン" + shochu
    end
    def shochu
        "ハイ"
    end
end
drink = Drink.new
puts drink.alc

 

Drinkクラスの中でalcメソッドとshochuメソッドの2つを定義してみたよ。で、alcメソッドの中でshochuメソッドを呼び出してるって感じだね。クラスの外からメソッドを呼び出す時はdrink.alcのようにレシーバを指定するんだけど、クラスの中の場合はshochuだけのメソッド名だけで呼び出せちゃう。これは省略した書き方で、この場合は実行中のalcメソッドのレシーバのdrinkなのでDrinkクラスのオブジェクトがレシーバになるって感じ。ちょっとややこしいけど落ち着けばOK!

 

selfでレシーバを調べてみる

class Drink
    def alc
        p self
        "ウーロン" + shochu
    end
    def shochu
        "ハイ"
    end
end
drink = Drink.new
p drink
puts drink.alc

 

#<Drink:0x00005623db866af0>
#<Drink:0x00005623db866af0>
ウーロンハイ

 

こんな感じの実行結果になるんだけど、selfはその場所でメソッドを呼び出した時のレシーバを返す。shochuの前にselfを書いてあげると上みたいな結果になるんだよね。

 

p drinkとputs drink.nameが同じレシーバってのがわかるね。Drink:+同じ識別番号になってるもんね!これは面白いねー。

 

 

ってな感じで段々と難易度上がってきてる感はあるけど、やっぱり2周目やってると、「あーそういうことだったのね!スッキリ!」みたいなのとか「それなら、こうだったらどうなるんだろう?」みたいな感じで余計に沼に一歩一歩入り込んでいってる気がして面白いぜ!

 

超入門も残りわずかなので、スタート時の気持ちを忘れずに丁寧にやっていこう。

 

ってことで今日はこの辺で!

 

アディオス!