Ruby 裡的 self 是什麼意思

Anne Ju
2 min readAug 15, 2019

根據Ruby使用手冊,self永遠指示目前正在執行的物件。我們今天把用p在各處印出來看看。

# 位於最上層,直接在Object中印出
p self #=> main
p self.class #=> Object
class Cat
p self #=> Cat,表示指向當前類別
def instance_method #實體方法
p self #=> #<Cat:0x00007fae2a00d7e8>,指向當前實體
end
def self.class_method #類別方法
p self #=> Cat,表示指向當前類別
end
endkitty = Cat.newdef kitty.meow
p self #=> #<Cat:0x00007fae2a00d7e8>,指向當前這個實體
end
module Fly
p self #=> Fly,表示指向當前模組
def fly
p self #=> 如果是用實體include這個模組,指向該實體
# 如果是用類別extend這個模組,指向該類別
end
end

可見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"> 指向這個實體

end
def talk
self.gossip #=> 在呼叫private時,因為private規定前面不能有點,所以這邊會失敗
end

private
def gossip
p "我跟你說個八卦"
end
end
ben = Human.new
ben.set_name('Ben')

由前可以印證類別中的self指向自己這個類別,我們甚至可以拿來做實體變數時來指定對象。但比較例外的就是在private methos中,因為private method的限制,所以無法使用self。

參考資料:

Ruby 使用手冊:變數 Variables

Ruby之self详解(一)详细剖析

為你自己學 Ruby on Rails類別(Class)與模組(Module)

--

--