Re: [問題] self的意思?
※ 引述《whk ()》之銘言:
: 環境:
: Ruby 1.8.6
: Rails 2.0.2
哪裡有 rails ? @@
: iCantBelieveIMadeAVariableNameThisLongJustToPointToA3 = 3
: puts iCantBelieveIMadeAVariableNameThisLongJustToPointToA3
: self.puts iCantBelieveIMadeAVariableNameThisLongJustToPointToA3
: 然後執行ruby之後的錯誤訊如下
: 「3
: cal.rb:14: private method `puts' called for main:Object (NoMethodError)」
: 原文是說會印出二個3
: 但我是出現錯誤訊息
我想原文是想表達,self 寫不寫都是一樣的,但其實這並不是那麼單純的。
不寫 self, 表示按照標準流程去尋找回應者,這第一個會找的是 local varaible.
a = 10
def a
100
end
a # => 10
a() # => 100
self.a # => 100
再來會是 self, mixins, parents, etc... 詳細順序我可能有講錯,
原則上是越接近 callee 的優先性越高。不過其實寫不寫 self 一般來說
差異確實是不大的,主要有以下幾個差異:
1. setter 會和 local variable 打架,所以 setter 要明白說明是 self.
e.g., self.a = 10; 如果寫成 a = 10, 則 a 會變成 local variable.
2. 不寫 self 可以呼叫 private method, 寫了則不行。乍看之下很詭異,
其實這是有道理的。不寫時表示是在自己呼叫自己,所以可以呼叫。
寫了 self, 表示是他人在呼叫,就像是 that.a 那樣,
所以不能呼叫 private method.
這個,其實我覺得不算是真的很好的作法,不過 ruby 現階段是這樣做。
在此例中,puts 其實是 Kernel 的 private method. 而 Object 會 include Kernel,
所以每個地方都能夠使用 puts. 是的,其實就像 global function 一樣。
但說 self.puts 時,由於無法呼叫 private method, 所以會有上述的錯誤。
是嘛,global function, 說 1.puts 有意義嗎?沒有嘛...
ruby 為了達成這樣的 global function, 所以有這樣的設計。
--
生死去来、棚頭傀儡、一線断時、落落磊磊
《花鏡》-世阿弥
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.28.18
推
01/22 10:39, , 1F
01/22 10:39, 1F
→
01/22 14:12, , 2F
01/22 14:12, 2F
討論串 (同標題文章)
Ruby 近期熱門文章
PTT數位生活區 即時熱門文章