心はいつもAirPucci (空元気でもいいから)

毎日がPucciを着ているような気分

初めてのRuby8章 8.4特異メソッドと特異クラス

   


特異メソッドと特異クラス

プログラムなんて、クラスの継承だけで書けてしまうのが良いように思えます。特異メソッドと特異クラス、いつどう使うんだろうか。

8.4.1 特異メソッド

特異メソッドとはクラスでなくインスタンスに属している。この定義だけで既にクラスのハレーションだ。なんでそんなものが言語仕様にいれるほどに必要なんだ。。

def式のメソッド名を、オブジェクト.メソッド形式で記述すると特異メソッドになる。

yoi = "Hello"

def yoi.aisatsu(aite)
  "#{self}, #{aite}."
end

p yoi.aisatsu("Yoko!") #=>"Hello, Yoko!."

warui = "Bububu"
# p warui.aisatsu("Sususu") #=>undefined method

Singltonパターン
特異メソッドはSingltonパターンに使える。

CENTRAL_REPOSITORY = Object.new
def CENTRAL_REPOSITORY.register(target)
  @registered_objects ||= []
  unless @registered_objects.include? target
    @registered_objects << target
  end
end

def CENTRAL_REPOSITORY.unregister(target)
  @registered_objects ||= []
  @registered_objects.delete(target)
end

p CENTRAL_REPOSITORY.register(300) #=>[300]
p CENTRAL_REPOSITORY.unregister(300) #=>300

8.4.2 特異クラス

CENTRAL_REPOSITORY = Object.new

class << CENTRAL_REPOSITORY
  def register(target)
    @registered_objects ||= []
    unless @registered_objects.include? target
      @registered_objects << target
    end
  end

  def unregister(target)
    @registered_objects ||= []
   @registered_objects.delete(target)
  end
end

p CENTRAL_REPOSITORY.register(300) #=>[300]
p CENTRAL_REPOSITORY.unregister(300) #=>300

さっきのと同じ。class << オブジェクト名 が特異クラスの書き方。 [ruby] class Aisatsu #クラス def eigo #インスタンスメソッド puts "Hello" end end aisatsu = Aisatsu.new aisatsu.eigo #=> Hello def aisatsu.Nihongo puts "こんにちは" #特異メソッド end aisatsu.Nihongo #=> こんにちは def Aisatsu.dame # クラスメソッド puts "sxxt" end Aisatsu.dame  #=> sxxt [/ruby]

8.4.3 クラスメソッドとメタクラス

クラスメソッドは実はClassオブジェクトの特異メソッド。

あるクラスはその特異クラスのインスタンス。あるクラスはクラスなので、その特異クラスとはクラスのクラス、つまりメタクラス。

クラスに特異クラスが内包されているイメージだったけど逆かあ。
私=クラス、スタンド=特異クラスとすると、
私がいるからスタンドがいるんじゃなくて、スタンドがあるから私がいる、ってことか。精神があるから肉体があるって感じですね。

メタクラス、特異クラス、クラスメソッド、特異メソッドをジョジョでやってみた。

class StandJoshi
end

class Jorin < StandJoshi
  def name(who) #インスタンスメソッド
    puts "#{who}'s name is Jorin Kujo."
  end

  class << self #特異クラス(メタクラス)
    def stand #特異クラスのインスタンスメソッド=クラスメソッド
      puts "Stone Ocean"
    end
  end

  def self.lover #クラスメソッド=クラスオブジェクトの特異メソッド
    puts "Hermes"
  end
end

jorin = Jorin.new

def jorin.Father #Jorinクラスのオブジェクトjorinの特異メソッド
  puts "Jotaro Kujo"
end

class << jorin #特異クラス
  def lasbos
    puts "Jorin's LastBoss is Pucci."
  end
end

jorin.name("Jorin") #=> Jorin's name is Jorin Kujo.
jorin.Father #=> Jotaro Kujo
Jorin.stand #=> Stone Ocean
Jorin.lover #=> Hermes
jorin.lasbos #=> Jorin's LastBoss is Pucci.

tomochingo = Jorin.new

tomochingo.name("Tomochingo") #=> Tomochingo's name is Jorin Kujo.
#tomochingo.Father #=> No method error

 - テクニカル ,

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  関連記事

no image
RailsTutorial4.0を高速で復習する。6.5章。

演習1問目。 リスト6.20の、メールアドレスを小文字に変換するコードに対するテ …

no image
RailsTutorial4.0を高速で復習する。9.1.2章。

9.1.2編集の失敗、です。 テストを書きます リスト9.9 ユーザーupdat …

no image
RailsTutorial4.0を高速で復習する。6.3.5章。

6.3.5ユーザーを作成する、です。 userモデルはできています。開発用のデー …

教育のためならば、iPadアプリ料金なんて青天井ですわ

今年4月、USでのiPad発売。姪の中学入学祝いにちょうどいいなと思っていたら日 …

ジョジョ専用kindle fire HDの電源が入らない!

電源が入らない!MacBookAirが真っ黒になりました。とか、 iPhoneの …

Chromeでの文字化けを対処しました。

WordPressで自作テンプレを作ってみたのはよいものの、困った問題が2つ。 …

no image
IBActionのIBって?

railsもやってますが、xcodeも再開しています。 ところで、 IBActi …

herokuのWe’re sorry, but something went wrong.に苦しんだ

Rails3.2環境に戻してアプリを作ろうとしています。 herokuにpush …

no image
RailsTutorial4.0を高速で復習する。8.3章。

8.3Cucumberの紹介 (オプション) Cucumberは振舞駆動開発用の …

no image
RailsTutorial4.0を高速で復習する。6.2.4章。

6.2.4フォーマットを検証する です。 メールアドレスは文字数制限だけじゃだめ …