Rubyのインスタンスメソッドとクラスメソッドの違いをわかりやすく。


はじめに

今までRubyの重要概念であるインスタンス,クラスについて明確にわかっていなかったので例を挙げながら説明していきます。Ruby使う上で絶対にわかっていなければならないことだと思うのですが、理解が甘かったので。

本記事の対象

・Ruby初めての方
・クラス、インスタンスが曖昧になっている人

インスタンス・クラスとは

例として、twitterのようなサービスで、Tweetクラスのもと、下のようにuserたちがidが1~3の投稿をしていることとします。

このとき黒い四角でかこった一つ一つの投稿はインスタンスです。インスタンスはクラスの型から生成されたオブジェクトといわれます。そしてTweetはクラスです。インスタンスがクラスに属しているイメージです。
Rubyの重要概念です!!

コードで理解

class Tweet
  #クラスメソッド
  def self.tweet
    puts "tweet"
  end

  #インスタンスメソッド
  def post_tweet(user,about)
    puts "#{user}さんが#{about}について投稿しました"
  end
end

#実行
Tweet.tweet

new_tweet = Tweet.new()
new_tweet.post_tweet("choco","プログラミング")

実行後

tweet
chocoさんがプログラミングについて投稿しました

クラスメソッド => クラスに対して行われるメソッド。

・classの外で 「クラス名.メソッド」 で呼び出す。(上の例だとTweet.tweet)
・selfを削ると怒られる。(selfでクラスメソッドだと宣言する)
=>クラスの中で self.メソッド名 ~~ end で定義できます。
・all,newなどはあらかじめ定義されているクラスメソッドで、クラスに対しての操作ができます。(allはクラスのインスタンスを全部取得、newはクラスに新しいインスタンスを作成)

インスタンスメソッド=>インスタンスに対して行われるメソッド。

・classの外で 「インスタンス名.メソッド」で呼び出す。(上の例だとnew_tweet.post_tweet)
インスタンスはクラスに属すため、クラス名.newでインスタンスを作成して、そのインスタンスに対してメソッドを実行します。
・基本的に実装中はインスタンスメソッドを使うことが多いと感じます。

おわり

この記事を書いていて、Rubyがすごくわかりやすく・直感的な設計なのだと思いました。これからもう少しちゃんとインスタンス・クラスを強く意識してメソッド定義していこうと思います。

読んでくださった方、ありがとうございました。
ご指摘がありましたらよろしくお願いします。