What is self and when do we use “self” in Ruby?
在Ruby中的self是什麼?我們什麼時候會使用self?
要回到這個問題首先要了解self
是什麼
self
在Ruby中是一個很特別的存在,永遠指向正在執行的那個物件。
下面直接舉程式碼來說明會更加清楚。
class Dog
p self # => Dog
def bark
p self
end
def self.eat
p self
end
end
dog1 = Dog.new
dog1.bark # => #<Dog:0x000055631b5a1710>
p dog1 # => #<Dog:0x000055631b5a1710>
Dog.eat # => Dog
我們在三種不同的地方印出self
那如果直接在irb中打上self
呢?
p self # => main
p self.class # => Object
會印出main
,main
是所謂Ruby程式的上層(top level),是我們輸入Ruby程式碼的這個區域,是一個叫做main
的物件,由Object
這個類別所生出來的。沒想到我們輸入程式碼的地方也是個Ruby的物件,但這個物件有其特殊的地方,與其他的Ruby物件不同。例如下面這種情況
def say_hello
puts "hello"
end
p self.private_methods.include?(:say_hello)
# => true
當我們在main這個物件中定義say_hello
方法時,卻會被歸類在Object這個類別的private instance method中,根據Ruby之父Matz在這個討論串解釋了當初這樣設計的理由:因為比較自然。
了解self以後,何時會用到self呢?
self
會指向正在執行的那個物件,若定義在類別方法中,會指向該類別。若定義在實體方法中,self會指向呼叫該方法的實體。
而我們使用self的時機是來定義類別方法的時候,以及debug來確認自己所正在使用物件的時候。