ruby中的self
self,自己,在ruby中表示當前對象或默認對象。程序執行的任一時刻,有且僅有一個self。
?
1.誰成為self,在什么位置成為self?
要知道哪個對象是self,就必須知道當前的上下文。上下文主要有頂層上下文,類定義上下文,模塊定義上下文,方法定義上下文。可以根據下圖總結的內容進行self的判斷。
| 上下文 | 例子 | 哪個對象是self |
| 頂層 | 在任何定義塊之外的代碼 | main(內建的默認頂層對象) |
| 類定義 | class C | 類對象C |
| 模塊定義 | module M | 模塊對象M |
| 方法定義 | 1 頂層方法 def method_name ? 2實例方法定義 class C def method_name ? 3模塊中的實例方法定義 module M def method_name ? 4單例方法(包括類方法) def obj.method_name | main(內建的默認頂層對象) ? ? C的一個實例對象,這個實例對象響應method_name方法調用 ? ? ? (1)用M擴展的單個對象 (2)混含了M的類的一個對象實例 ? ? obj |
?
1.1頂層中的self
頂層上下文的self是main,頂層方法的self也是main。main是object的一個對象。
?
1.2類和模塊中定義中的self
類中的self是類對象本身
類中實例方法的對象是實例對象
模塊的self是模塊的名字
?
1.3單例方法中的self
obj作為對象,它的單例方法中的self就是obj。
?
2.self作為消息的默認接接收者
方法調用一般是obj.method的方式,用一個圓點標記,左邊是接收者,右邊是方法。但是,當接收者是self的時候,可以省略接收者和圓點。ruby將self當做默認的接收者,意味著你發送的消息會發給self。即method等價于self.method。
類方法中調用了hello。等價于self.hello。因為在類中,相當于A.hello,打印出了”hello world“。在類外使用hello時,self是main,沒有這個函數,所以報錯。用A.hello當然是對的。
但是值得注意的是,在調用寫方法(以等號結束的方法)的時候,即使是發送消息給當前的self,也不能省略。例如調用方法venue=,要寫成self.venue ="hello"。如果寫成venue="hello",ruby則將它解釋為對局部變量的賦值。
?
3實例變量和self
ruby中實例變量是以@開頭的變量。值得注意的是,在ruby程序中看到的任何實例變量,都是屬于程序中該位置的當前對象self。
第一個@var是屬于類A的,因此在創建類之后就執行了,打印出hello。方法中的@var是屬于類的實例對象的,因此在創建A的實例對象之后調用方法,打印出world。這兩個@var完全無關。任何對象都可以有實例變量--它的信息和對象狀態的私有存儲處。
轉載于:https://www.cnblogs.com/smallbottle/p/3854116.html
總結
以上是生活随笔為你收集整理的ruby中的self的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 配置源码管理工具(2)
- 下一篇: 免费WiFi,仅仅为好久没联系的你们