0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Ruby メソッドとクラス

Last updated at Posted at 2020-10-31

話すこと

1:メソッド
2:クラス
3:インスタンスメソッド
4:クラスメソッド
です。

1:メソッドとは

メソッドとは、複数の処理をまとめてくれるもの。

greet.rb
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:コードの修正が容易になる

例えばこんな感じのコードがあるとする。

number.rb
puts 1
puts 2
puts 3
puts 4

puts 1
puts 2
puts 3
puts 4

いちいち、puts 1と書くのはとても面倒なため、メソッドを使って書き換えてみる

number.rb
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を削除するだけで良い。

number.rb
def number
  puts 1
  puts 2
  # 削除
  puts 4
end

number # 1回の実行で1,2,4一気に出力してくれる
> 1
> 2
> 4

このように再利用化されやすいよう、メソッドを作ることで、全体の修正も安易になっていくものとなる。

2:クラスとは

インスタンスを生成する際に使用する元となるもの。クッキーを作るときの型のようなものだと思えば想像しやすいかも。

cookie.rb
Class Cookie #クラス名=Cookie
  def cookie #メソッド名=cookie
  end
end
#実際にCookieクラスという型からインスタンスを生成 ↓
cookie = Cookie.new
cookie
#出来た ↓
=> #<Cookie:0x00007ff34c847fa0>

<Cookie:0x00007ff34c847fa0>
が、Cookieクラスによって作られたインスタンスである。クラス名.newとすることで、インスタンスは生成可能となる。インスタンスとは、元となるものから作られた実体そのものを指す。簡単に言えば、型から作られた実際のクッキー。

情報を持ったインスタンスを作る

initializeメソッドを使うことで、インスタンスを生成するときに情報を持たせることができる。今回はCookieインスタンスに size、taste と二つの情報を持たせてみる。

cookie.rb
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'と対応している。
これを応用することで、

cookie.rb
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クラスから作られただけで、使用されていない。
インスタンスメソッドは、コイツらを使用して何かすることを目的としている。

cookie.rb
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:クラスメソッドとは

先ほどまではインスタンス経由であったが、クラス経由で同じことが出来る。インスタンスのデータを参照する必要がない時に使う。

cookie.rb
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

これを実行した上で

cookie.rb
# クラスメソッドの実行
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
とても参考にさせていただきました。ほぼこの記事の簡潔版として書かせていただきました。記事にすることで、浅い知識だったところをカバーできました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?