根據Ruby使用手冊,self
永遠指示目前正在執行的物件。我們今天把用p在各處印出來看看。
# 位於最上層,直接在Object中印出
p self #=> main
p self.class #=> Objectclass Cat
p self #=> Cat,表示指向當前類別 def instance_method #實體方法
p self #=> #<Cat:0x00007fae2a00d7e8>,指向當前實體
end def self.class_method #類別方法
p self #=> Cat,表示指向當前類別
endendkitty = Cat.newdef kitty.meow
p self #=> #<Cat:0x00007fae2a00d7e8>,指向當前這個實體
end
module Fly
p self #=> Fly,表示指向當前模組 def fly
p self #=> 如果是用實體include這個模組,指向該實體
# 如果是用類別extend這個模組,指向該類別
endend
可見self
這個變數,會根據所在的context而有所不同,指的就是當下那個物件「自己」。
我們再看看一些self在類別裡的使用:
class Human
attr_accessor :name def set_name(your_name)
self.name = your_name #=> self.name 成為實體變數 @name
p self #=> #<Human:0x00007fc43e028e38 @name="Ben"> 指向這個實體
enddef talk
self.gossip #=> 在呼叫private時,因為private規定前面不能有點,所以這邊會失敗
end
private
def gossip
p "我跟你說個八卦"
end
endben = Human.new
ben.set_name('Ben')
由前可以印證類別中的self指向自己這個類別,我們甚至可以拿來做實體變數時來指定對象。但比較例外的就是在private methos中,因為private method的限制,所以無法使用self。
參考資料: