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

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

  関連記事

railsでtest unitを生成させない

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

no image
iPhoneのKindleアプリでChip Conley氏の本を読んでみました。その1

GWで電子本も文庫本も読み終え、「新しい本に入れ替えないと~」と思いながらすっか …

no image
MavericksアップデートしRuby2.0+Rails4.0.2にversion upする

何を今さら感ですが、MacはAirとMiniの2台持ちです。Airのほうを人柱と …

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

6.2.1最初のユーザーテストです。ユーザーモデルをrails g modelで …

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

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

WordPressの管理画面真っ白問題に対処しました

WordPressの自作テンプレを作ったはいいものの、管理画面が真っ白になって投 …

no image
Ruby1.9と2.0、複数バージョンのRubyをインストールする。

Ruby1.9 + Rails3.2もいいけど、Ruby2.0 + Rails4 …

もうあかん!Mac OSXのスクロールを逆にする

OSXのいつのバージョンからだっけ? スクロールの向きが突如逆になったんですよね …

Ruby on Railsを4.1.0にバージョンアップする

真央ロス真央廃を超えた腐まお状態な1ヶ月1週間、まるで娘が嫁に行った父親のごとし …

attr_accessorでRuby文法を噛み締める

作りたいwebアプリがあって、プログラムやろう!となって現在にいたってる訳です。 …