Re: [問題] self的意思?

看板Ruby作者 (godfat 真常)時間17年前 (2008/01/21 20:34), 編輯推噓1(101)
留言2則, 2人參與, 最新討論串2/3 (看更多)
※ 引述《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
文章代碼(AID): #17b94uYt (Ruby)
討論串 (同標題文章)
本文引述了以下文章的的內容:
1
2
以下文章回應了本文
完整討論串 (本文為第 2 之 3 篇):
1
2
文章代碼(AID): #17b94uYt (Ruby)