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

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

  関連記事

BD再生のオープンソース

メディアはシリコンすら持ちたくない主義なのですが、どうしてもBluelay Di …

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

6.3セキュアなパスワードを追加する、です。 パスワードはセキュアであるべきと思 …

格安で真央ごもりする浅田真央システム完成

さいたまスーパーアリーナでの世界選手権で、浅田真央ちゃんのショートプログラム世界 …

Railsを立ち上げる

RubyのアップデートとRailsのインストールが無事終わったので、いよいよRa …

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

9.4.2 destroyアクション、です。 テストを書く FactoryGir …

文字化けもするし、、

自作テンプレ作ったはいいですが、問題が、、。 関連しそうな記事 iTunesをM …

実機なしでRetina 3.5インチのスクリーンショットを撮る

iPhoneアプリ公開時に2種類の画像登録が必要です。 1つ目はアイコン。アプリ …

no image
Ruby 1.9系をインストールする

Rubyのバージョン管理ができるrbenvをインストールしたらいよいよRubyの …

GitにRailsプロジェクトをpushする

HomebrewerでGitをインストールし、Rails 3.2やRails4. …

no image
RailsのRoutingいろいろ

コントローラーがAbc アクションがactrionxだとして、 http://y …