Ruby初心者的學習筆記2:難以捉摸的self

Apple Chen
3 min readAug 16, 2019

--

印象中第一次見到self,是在龍哥介紹「開放類別」的時候,那時候也沒有想太多,就是硬記「遇到這種問題就把self帶進去」。但當要我們簡介self的時候,才發現跟self真是不熟啊!

好,先來看看在irb下輸入self會發生什麼事。

他說self是個叫”main“的物件。那main又是什麼呢?根據查詢結果,main是Object class下的實體(instance),概念大概等同於 main = Object.new。

再來用.class的方法看看self屬於哪個類別。

可以得知self是屬於Object類別。果然跟上述main的查詢結果是一致的。

接著來看看self在不同方法下的樣貌。

實體方法(instance method)

此時self為Cat產生的實體

類別方法(class method)

此時self為Cat class本身

類別定義(class definition)

此時self為Cat class本身

模組定義(module definition)

此時self為Cat module本身

繼承(inheritance)

此時self為Meow產生的實體

引入模組(include module)

此時self為Meow產生的實體

總結

在類別方法、類別定義、模組定義下,self為其類別、模組本身。
而在實體方法、繼承、引入模組時,因為皆使用了實體方法,所以self為該類別產生的實體。
寫到這裡,其實對self還是似懂非懂,就留待功力更高深(應該會有那一天……吧?)的時候再來補充了。

參考資料:

Understanding `self` in Ruby

Rubyのselfが微妙に意味がわからなかったので、様々な文脈(トップレベル、class定義内、method定義内、module定義内)で出力してみた

Ruby のトップレベルについておさらい

--

--