初めての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
関連記事
-
-
ジョジョ専用kindle fire HDの電源が入らない!
電源が入らない!MacBookAirが真っ黒になりました。とか、 iPhoneの …
-
-
RailsTutorial4.0を高速で復習する。9.2.2章。
9.2.2正しいユーザーを要求する、です。 テストを書く 自分以外の人がプロフィ …
-
-
WindowsのiTunesからMacのiTunesへのデータ移行
MacBookAir 2日め。なかなかMacにふみきれなかったのは、Window …
-
-
Macで.htaccessを表示する設定
MacBook Air2代目。以前は行っていた.(ドット)がついたファイルをMa …
-
-
RailsTutorial4.0を高速で復習する。4章と4.1章。
さて、4章です。4章ではRubyに関する内容が多かったような記憶が。 動的なWe …
-
-
RailsTutorial4.0を高速で復習する。5章。
さてRailsTutorial4.0も5章に入ります。まだ序の口です。5章ではb …
-
-
RailsTutorial4.0を高速で復習する。9.3章。
9.3すべてのユーザーを表示する、です。 いろいろ細かい実装するまえにこれやるべ …
-
-
アイキャッチ画像のリサイズ
768 × 1024 pxの写真をアイキャッチに指定して、150pxにリサイズ表 …
-
-
サーバー移転しました(2度目)
airpucci始まって2度目のサーバー移転しました。今まで入れていたプラグイン …
-
-
民●党批判したら検索順位が落ちたのか?
このブログ、airpucciのドメインも元のwww.airpucci.comに戻 …
- PREV
- 初めてのRuby8章 8.2変数と定数
- NEXT
- メタプログラミングRuby第1章