Ruby面試精選30題 - Day04 玩弄Ruby的方法: instance method與class method
在第三天裡,我們解說了如何在class裡用include與extend使用module的method。
Include is for adding methods to an instance of a class. Extend is for adding class methods. (出處) …Also, it is sometimes ok to use “include” to add both instance and class methods. # 這句話比較進階,之後再研究:)
並透過圖書館模組的程式碼明白這段話的含義:
include
是把類別
中的物件實體
加上方法
;
extend
是用於類別方法
。
module Library
def IThelp
p "IThelp helps me!"
end
end
class NewbieLearnsRuby
include Library
end
class ExtendRuby
extend Library
end
NewbieLearnsRuby.new.IThelp
# IThelp helps me!
ExtendRuby.IThelp
# IThelp helps me!
話不多說,進入今天的章節!
重點摘要:
Ruby經典面試題目 #04
- 解釋
實體方法
與類別方法
Explain instance method and class method.
類別方法class method
為了瞭解類別方法,我們今天要建立新的類別class:鐵人賽名單IronmanList
,讓這個class利用find方法
,以傳入的id值順利找到某位鐵人賽的參賽者:
class IronmanList
class << self
def find(id)
p "finding Ironman ID: #{id}"
end
end
end
IronmanList.find(1)
# finding Ironman ID: 1
當傳入1
給id
,會使IronmanList
這個類別,印出finding Ironman ID: 1
。
以上的程式代表,當接收者不是物件object
,而是類別class
本身,就是一個類別方法class method
。
這邊的
<<
指的是push
方法,用在class method
,意思是將self method
push到類別class
裡。
鐵人賽名單class也可寫為:
class IronmanList
#class << self
def self.find(id) #在這裡的self is a class Method
p "finding Ironman ID: #{id}"
end
#end
end
IronmanList.find(1)
我們把 class << self ... end
這部分都用註解消掉,直接使用self這個class method,讓 self.find(id)
與之前呈現出一樣的結果!
使用class method的情況
當我們要寫class method時,如果此方法並不會和某個特定的實例變數綁在一起,就該使用類別方法!
實體方法(instance method)
把鐵人賽名單類別擴充一下,除了find方法
,還有ironmanwinner方法
:
class IronmanList
def self.find(id)
p "finding Ironman ID: #{id}"
end
def ironmanwinner
p "I've got a trophy!"
end
end
IronmanList.find(1) #這是類別方法
IronmanList.new.ironmanwinner #這是實體方法
結果會印出:
finding Ironman ID: 1
I've got a trophy!
使用instance method的情況
如果你需要將實體方法,運用在某個客製化的實體。
This is often when the functionality concerns the identity of the instance such as calling properties on the object, or invoking behaviour.出處
如同鐵人賽的贏家不會只有一個名額,只要能自我挑戰成功,都能練成鐵人:)。
因此我們可以再new更多的物件,盡情使用這個ironmanwinner
實例方法:
class IronmanList
def self.find(id)
p "finding Ironman ID: #{id}"
end
def ironmanwinner
p "I've got a trophy!"
end
end
# IronmanList.find(1)
Ting = IronmanList.new
Ting.ironmanwinner
Bater = IronmanList.new
Bater.ironmanwinner
結果印出:
"I've got a trophy!"
"I've got a trophy!"
同樣的,例子🌰不會只有一種,解釋方法更不會只有一種。我們除了用自己寫的程式碼理解概念,近一步拿關鍵字 instance method class method ruby
去請教Google大神透過網路這座大圖書館,其他工程師們的部落格文章、透過各種文字說明與舉例加深我們的印象。看到排名第一的解釋寫著:
Class can use methods from three areas: 1) Instances of class can call methods that are defined as instance methods in their class. 2) Instances of Class have access to the instance methods defined in Module 3) Or instances can call a singleton method of a class object. 出處
這裡又發現一個新名詞了:singleton method
,這可以成為我們下一篇的素材呢!
=欲知詳情,下回分解!=
Ref: