バンビのブログ

駆け出しのエンジニアです!日々の疑問など備忘録として書いていきます。

【Ruby】特異クラスってなに?シンタクスシュガーって?

特異クラスってなに?シンタクスシュガーって?

最近Railsで開発をしているときに、恐らく僕の師匠が書いたであろうコードを見つけた。

class Hogehoge
  class << self
    def call(*args)
      new(*args).call
    end
  end
end

こんな感じのコードだったんだけど、こんな短いのにまじでわかんなかったw

ああ、これがRailsばっかやってて生のRuby全然やってない負債ってやつかw って思ったら急にやる気(焦り)がでてきて調べてみた。

上のコードは特異クラスっていうやつらしい

特異クラス

クラスメソッドの定義の仕方には大きくわけて2種類

特異メソッド方式

特異クラスによるクラスメソッドの定義例
class Hoge

    def Hoge.クラスメソッド名1
    end

    def Hoge.クラスメソッド名2
    end
    
    メソッドを定義するときにメソッド名の前にクラス名を書いて定義する

end

特異クラス方式

特異クラスによるクラスメソッドの定義例
class Hoge

  class << self

    def クラスメソッド名1
    end

    def クラスメソッド名2
    end
    
    いくつ定義してもクラスメソッド名の前にクラス名をかかなくていいから便利

  end
end

クラスメソッドとインスタンスメソッドはなにが違うの?

文系4大卒、プログラマー歴半年未満なのでミリも気にしたことなかったですw

なのでこの際簡単に調べました。奥深くまでは行きません。

クラスメソッド

まあクラスから呼び出せるねん、、、、

そのクラスから作成したインスタンスからそのクラスメソッドは呼び出せないねん、そやねん

インスタンスメソッド

まあクラスから生成したインスタンスから呼び出せるねん、、、、

クラスから作成したインスタンスからそのクラスのクラスメソッドは呼び出せないねん、、、 インスタンスメソッドだけやねん、、、そやねん。

class Hoge

 # インスタンスメソッドの定義 => いつも書いてるやつ
  『hoge』っていうインスタンメソッドを定義

  def hoge
    p "インスタンスメソッド呼び出し成功"
  end


# クラスメソッドの定義 => 上で説明したやつ
  『fuga』っていうクラスメソッドを定義

  def self.fuga
    p "クラスメソッド呼び出し成功"
  end

end



# インスタンスメソッドの呼び出し
  Hogeクラスからインスタンスを生成!

Hoge.new.hoge

 結果:"インスタンスメソッド呼び出し成功" って表示される。呼び出し成功


#インスタンスメソッドの呼び出しに失敗する
 クラスからインスタンスメソッドは呼び出せませんなあ〜(・8・)
begin
  Hoge.hoge
rescue
  p "インスタンスメソッド呼び出し失敗"
end


#クラスメソッドの呼び出し

Hoge.fuga  

 結果:"クラスメソッド呼び出し成功" って表示される。呼び出し成功( ・8・ )


#クラスメソッドの呼び出しに失敗する
  インスタンスからクラスメソッドは呼び出せませんなあ〜(・8・)(・8・)(・8・)
begin
  Hoge.new.fuga
rescue
  p "クラスメソッド呼び出し失敗"
end

こんな感じで使い方が違うみたい。

じゃあ、このクラスメソッドインスタンスメソッドはどう使い分けるの?

という疑問は次回書きます。

次回

クラスメソッドとインスタンスメソッドはどう使い分けるの?

クラスとモジュールってどう使い分けるの?

オブジェクトを「クラス」から作り出すクラスベースのオブジェクト指向とオブジェクトを「オブジェクト」から作り出すインスタンスベースのオブジェクト指向、、、、、????(これは、、、、時間かかるやつだ。)

あ、シンタックスシュガーわすれてたw

シンタックスシュガーとは、『プログラミング言語において、既存の構文などを別の構文や記法で記述できるようにしたもの。 長い構文を簡略に記述できるようにしたり、複雑な構文を見やすくするために用意されることが多い。』

はい。ぐぐったら1番上に出てきました。。。w(・8・)

三項演算子とか配列作るときの『%w』とかもシンタックスシュガーって言われるらしい。

まあ、なんか、簡単にかけるようにしたもんかってくらいの認識でいいかな笑

疲れてのでこのあたりでオシマイにします。

この記事のトピックで良い記事があったら教えてくださいませ。