前情提要:
在第四天裏,咱們用參賽者的例子解說實體方法與類別方法。
類別中的實體物件,想要玩弄方法時,能夠有三種取用方式:(跟斯斯有三種同樣)面試
該類別所定義的實體方法。數據庫
模塊中可取得的實體方法。(關於模塊,記得第三天的include與extend比較嗎?)設計模式
類別方法:類別物件的singleton method翻譯
Class can use methods from three areas:設計
Instances of class can call methods that are defined as instance methods in their class.
Instances of Class have access to the instance methods defined in Module
Or instances can call a singleton method of a class object.出處
因此咱們在今天要解說一下self與singleton method囉!orm
Ruby經典面試題目#05
self是什麼意思?What does self mean?對象
self有豐富層次的含義。就跟咱們的心裏同樣(??來點播一首陳綺貞的Self??)它雖然表明本身自己的物件Object,但還記得,咱們在第一天說到,Ruby的世界幾乎都是物件嗎?three
所以,self有兩種意思:資源
Self在類別class裏,表明目前的類別(leafor)。get
Self在實體instance裏,表明目前的實體。
簡單解釋:實體就是物體在內存的位置,就好像每一個寶寶(實體)生下來,都是從某個媽媽的子宮(內存)裏出來的。咱們必須經歷過實體化的過程才能成爲一個活生生的人呢!
幸虧,產生一個實體不用等「懷胎十月」這麼久,只要像咱們在第一天同樣使用@宣告內存位置就能夠產生實體變數了:
class LoveSong
def initialize
@message =「I was born to love you!」#定義實體變數(instance variable)@message
end
def sing_a_song
puts @message
end
end
Ting = LoveSong.new
Ting.sing_a_song
#=> I was born to love you!
用LoveSong類別另寫一段代碼實做self:
class LoveSong
def
self.song1()
「We are the champions!」
end
class << self
def song2()
「We will rock you!」
end
end
p self # => LoveSong
p self.class # => Class
p self.singleton_methods # [:song1,:song2]
p self.song1()#=>「We are the champions!」
p self.song2()#=>「We will rock you」
end
在這裏的self表明目前的類別名稱LoveSong,咱們查詢self.class仍是類別class,而這裏的self.singleton_method出現了:song1與:song2這兩個可以分別印出兩首歌的類別方法(class method)。
咱們在第一天文章曾經提到利用superclass查找父類別的方法,查到類別的父類別,是物件。class.superclass是object。
但其實:每個類別class上面都還有一層隱形的類別class(隱形的翅膀),咱們能夠稱做metaclass超類別。
在Ruby,類別class上面的隱形類別,咱們叫它eigenclass特徵類別。出處]。
Singleton Method
單例方法=單例類別的實體方法。
(指的是某物件實體「的單例類別」的實體方法,而不只是某個物件的實體方法,中間多夾了一層隱形的翅膀「單例類別」)
singleton methods of an object are not instance methods of the class of the object;
they are instance methods of the singleton class of the object.
當咱們講到Singleton Method,就會提到Singleton Pattern單例模式,這個在面嚮對象語言(如:Java)共同的觀念。
若是咱們能保證某一個類別只產生一個物件實體,並且提供存取該物件的統一方法。這種設計模式就稱爲單例模式。
咱們能夠直接存取,而不須要實體化此類別的物件。
使用Singleton Method的時機
當咱們想控制實體數目,節省系統資源的時候。
再度把例子搬出來:一間教室裏只有一臺打印機,全部電腦均可以聯機打印機,但打印機一次只能印出一臺電腦上的文件。
還記得咱們在第四天舉的例子是查找鐵人蔘賽者名單嗎?在這個例子中,一次只能查找一名參賽數據。
class IronmanList
def self.find(id)
p「finding Ironman ID: #{id}」
end
end
IronmanList.find(1)
使用規則:
此類別只能有一個物件實體。(IronmanList類別中,只有一個self)
此類別必須本身創建本身的惟一實體:def self.find(id)
此類別必須給其餘物件提供這個實體。
使用場景:
此物件是類別中惟一的物件。如同IronmanList的序列號惟一。(跟身份證號碼同樣)
當建立此物件須要消耗較的資源過多時,可節省系統資源。(例如:鏈接數據庫、鏈接打印機)
當咱們爲實體定義了自已的singleton method,表明了這個方法只屬於該實體,儘管是相同的class的實體也沒法使用別人的singleton method。(每一個實體的單例類別是不一樣的。)
總結
近一步說明類別方法、實體方法,與單例方法的關係。中文翻譯的話,咱們能夠這樣記:
類別的eigenclass(特徵類別)方法=類別方法(xcsjbj)。
實體的eigenclass(特徵類別)方法=單例方法=單例類別的實體方法。
實體方法
實體已在類別裏定義好了。
若是你須要將實體方法,運用在某個特定的實體,就記得要在類別裏定義好這個實體。
舉例:「每一個人(物件實體)都能贏得」的方法
類別方法
類別方法並不在類別裏定義,而是在類別裏的物件實體的一種單例方法。
若是此方法並不會和某個特定的實體變數綁在一塊兒,就使用類別方法!
舉例:「查找名單」的方法
學程序的好處就是會查找許多原文數據(間接提高英文閱讀功力!)
進一步發現許多原則上的定義用英文表達會更爲清楚。
因此,咱們第四天(實體方法與類別方法)與第五天的總結(單例方法的進一步說明),從這段英文就能看得更加清楚之間的關係了:)
Instance methods are methods of a class(defined in the class's definition)
Class methods are singleton methods on the Class instance of a class(not defined in the class's definition).They are defined on the singleton class of the object.More Information
編按:這篇算是我目前爲止寫過最有挑戰性的IT文章,由於牽涉到metaprogramming的定義,從一開始本身一頭霧水的狀況,努力查找許多原文數據,也從本身撰寫代碼舉例以後,總算得到一點頭緒。(還記得初版寫完的時候,本身也看不懂在寫什麼XD,多讀幾遍+反覆潤飾以後才漸漸領悟開竅。)寫文章或技術筆記的好處就是要真的懂了才寫得出來。若新手小妹我翻譯或理解上有錯誤,還請板上資深網友多多指教!:)