看板 Ruby 關於我們 聯絡資訊
※ 引述《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
whk:雖然看不是很懂,但還是感謝,再研究看看囉! 01/22 10:39
godfat:有問題歡迎再問 :) 01/22 14:12