話すこと
1:メソッド
2:クラス
3:インスタンスメソッド
4:クラスメソッド
です。
1:メソッドとは
メソッドとは、複数の処理をまとめてくれるもの。
def greet(name)
puts "#{name}, HELLO!"
end
greet('Alice')
> "Alice, HELLO"
の greet(name) がメソッドにあたる。メソッドは定義されている部分(def ~ end)では読み込まれず、実行されること(greet('Alice'))によって初めて読み込まれる。
メソッドは、
1:値を渡せる
2:最後に評価値が返る
3:メソッド内で定義した変数は、外部アクセスできない
という特徴を持っている。
メソッド名が長い場合、スネークケースで書くことが慣習なので、
greetHerではなく greet_her
sendMailではなく send_mail
という形で書く必要がある。
メソッドを使うメリット
1:メソッドで定義された処理は再利用が出来る
2:コードの修正が容易になる
例えばこんな感じのコードがあるとする。
puts 1
puts 2
puts 3
puts 4
puts 1
puts 2
puts 3
puts 4
いちいち、puts 1と書くのはとても面倒なため、メソッドを使って書き換えてみる
def number
puts 1
puts 2
puts 3
puts 4
end
number # 1回の実行で1,2,3,4一気に出力してくれる
> 1
> 2
> 3
> 4
また、もし puts 3が必要じゃなくなった時、メソッド内のputs 3を削除するだけで良い。
def number
puts 1
puts 2
# 削除
puts 4
end
number # 1回の実行で1,2,4一気に出力してくれる
> 1
> 2
> 4
このように再利用化されやすいよう、メソッドを作ることで、全体の修正も安易になっていくものとなる。
2:クラスとは
インスタンスを生成する際に使用する元となるもの。クッキーを作るときの型のようなものだと思えば想像しやすいかも。
Class Cookie #クラス名=Cookie
def cookie #メソッド名=cookie
end
end
#実際にCookieクラスという型からインスタンスを生成 ↓
cookie = Cookie.new
cookie
#出来た ↓
=> #<Cookie:0x00007ff34c847fa0>
<Cookie:0x00007ff34c847fa0>
が、Cookieクラスによって作られたインスタンスである。クラス名.newとすることで、インスタンスは生成可能となる。インスタンスとは、元となるものから作られた実体そのものを指す。簡単に言えば、型から作られた実際のクッキー。
情報を持ったインスタンスを作る
initializeメソッドを使うことで、インスタンスを生成するときに情報を持たせることができる。今回はCookieインスタンスに size、taste と二つの情報を持たせてみる。
class Cookie
def initialize(size, taste)
@size = size
@taste = taste
end
end
cookie = Cookie.new('Large', 'Sweet')
cookie
=> #<Cookie:0x00007ff34d2a7108 @size="Large", @taste="Sweet">
これにより、大きいサイズで、甘い味の、クッキーインスタンスを生成することができた。急に出てきた、
@size
@taste
@から始まるコイツらはインスタンス変数と呼ばれるもので、インスタンスごと(クッキーごと)に保持しているデータを変更することができる。今回、sizeは第一引数、tasteは第二引数で、それぞれ'Large', 'Sweet'と対応している。
これを応用することで、
cookie1 = Cookie.new('Medium', 'Bitter')
cookie1
=> #<Cookie:0x00007ff34d2cdd30 @size="Medium", @taste="Bitter">
cookie2 = Cookie.new('Small', 'Salty')
cookie2
=> #<Cookie:0x00007ff34d2cdd30 @size="Small", @taste="Salty">
と、複数のサイズと味を持った、クッキーインスタンスを生成することができる。
3:インスタンスメソッドとは
作成したインスタンス(クッキー)を用いて、実行できるメソッドのこと。
現時点で、クッキーの種類はSmall Saltyと、Medium Bitterと、Large Sweetの3つがあるとする。これらはCookieクラスから作られただけで、使用されていない。
インスタンスメソッドは、コイツらを使用して何かすることを目的としている。
cookie2
=> #<Cookie:0x00007ff34d2cdd30 @size="Small", @taste="Salty">
def cookie_taste
puts "#{@taste}"
end
=> :cookie_taste
cookie.cookie_taste
> Salty
cookieが持つ、@tasteインスタンスメソッドのデータが、cookie_tasteの@tasteにデータを渡すことに成功している。このように、インスタンスのデータを元にインスタンスメソッドはデータの参照だったりをすることが出来る。
4:クラスメソッドとは
先ほどまではインスタンス経由であったが、クラス経由で同じことが出来る。インスタンスのデータを参照する必要がない時に使う。
class Cookie
# @@が2つ付くものはクラス変数と呼ばれ、全てのインスタンスで共有することが出来る
@@my_cookie_is = 0
def initialize(size, taste)
@size = size
@taste = taste
@@my_cookie_is += 1
end
#インスタンスメソッド
def show_info
puts "#{@taste}クッキーは#{@size}サイズしかない。"
end
# クラスメソッド
def self.show_all_cookie
puts "俺は#{@@my_cookie_is}枚分のクッキー食うからな。"
end
end
これを実行した上で
# クラスメソッドの実行
cookie4 = Cookie.new('Medium','Bitter')
cookie4
=> #<Cookie:0x00007ff34d1ae440 @size="Medium", @taste="Bitter">
Cookie.show_all_cookie
俺は1枚分のクッキー食うからな。
# クラスメソッドの実行
cookie5 = Cookie.new('Large','Salty')
cookie5
=> #<Cookie:0x00007ff34c851c30 @size="Large", @taste="Salty">
Cookie.show_all_cookie
俺は2枚分のクッキー食うからな。
# インスタンスメソッドの実行
cookie4.show_info
BitterクッキーはMediumサイズしかない。
# インスタンスメソッドの実行
cookie5.show_info
SaltyクッキーはLargeサイズしかない。
となる。
参考
【Ruby】たい焼きで理解するオブジェクト指向におけるクラスの概念
https://pikawaka.com/ruby/class#%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9
とても参考にさせていただきました。ほぼこの記事の簡潔版として書かせていただきました。記事にすることで、浅い知識だったところをカバーできました。