心はいつも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

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

  関連記事

Mac miniの液晶モニターにDell U2713HM使っています。

次期モデルが出るかもしれないのにMac miniを買って、自分でメモリを16Gに …

吉瀬美智子さんが美しすぎて、新サイト作りました

以前からやりたいと思っていたのですが、吉瀬美智子さんが美しすぎてやる気がでました …

no image
RailsTutorial4.0を高速で復習する。5.6章。演習2問目。

5.6演習、2問目です。これをやったら、すっ飛ばしているリンク貼り作業をします。 …

民●党批判したら検索順位が落ちたのか?

このブログ、airpucciのドメインも元のwww.airpucci.comに戻 …

RailsTutorial4.0を高速で復習する。8.1.2章。

8.1.2サインインをテストする、です。 Signin(ログイン)失敗の場合 ロ …

no image
Ruby on Railsのインストール

Rubyのアップデートが終わったので、いよいよRailsをインストールします。 …

no image
データベースのリファクタリング?

ruby on rails3プリケーションプログラミングの本の内容をruby2. …

no image
WindowsのiTunesからMacのiTunesへのデータ移行

MacBookAir 2日め。なかなかMacにふみきれなかったのは、Window …

WordPress子テーマの作り方

デザイン変更したairpucci、TwentyTwelveというWordPres …

no image
サイドバーの幅を決めたい(Googleアドセンス編)

サーバー移転したままブログが放置状態になっています。 その間も検索エンジン経由で …