2011-10-05 57 views
1

分配值,我一直沒能找到關於這一主題的文檔或任何參考材料:Ruby: How to write a bang method, like map?紅寶石:參考資料更多地瞭解自我

任何人都知道的事情我可以閱讀更多地瞭解這個具體的的事情?

編輯:在評論的光,我修正這個問題如下:

於是,我們發現,數組和字符串可以通過自我的這個數組方式來處理:

self[i]= 

但這不是操縱自我的背後的整個故事。有很多關於自我的範圍和它在當前情況下的含義的參考資料,但我沒有發現關於操縱方法的很多內容。

如果我想寫我自己版本的Stringchomp!或其他爆炸方法怎麼辦?我是否使用self[0]...self[i]?其他課程呢?

謝謝!

+0

真的沒有更多的東西要學。 'self'是對當前「內部」對象的引用。您可以像處理任何其他對象一樣對'self'進行操作(但也可以直接訪問私有和受保護的方法)。如果您想了解更多信息,Google搜索第一頁上的大多數鏈接都非常穩固:http://www.google.com/search?q=ruby+self+object –

+1

是的,但儘管您可以訪問一個由'self [0] ='指定的字符串,只會讓你獲得第一個字符。不幸的是,'self ='不是一個有效的操作。在這些鏈接中真正沒有太多關於'self [0]'或類似的東西。儘管如此,我仍然會通過互聯網和紅寶石書籍繼續跋涉。 – wulftone

+0

我在[Metaprogramming Ruby](http://shop.oreilly.com/product/9781934356470.do)中發現了它的一些引用,但仍然沒有關於操作String的信息。 – wulftone

回答

1

首先閱讀article in Wikipedia about self(即使它根本沒有提及Ruby)。

爲了使長話短說:

  • 紅寶石已經借了很多概念,從其他語言,並self來自Smalltalk的。
  • self在Smalltalk中被稱爲僞變量,這意味着它是可變的,但它是由運行時環境設置的,而不是由程序或程序員設置的。
  • self一直引用消息的接收者。 super引用了該消息的超類,該消息由參考文獻super所在的方法實現。(很高興您沒有要求super)。
  • self在Ruby中(如在Smalltalk中)一直引用當前對象,並且可能是一個類的實例,甚至是類本身。所以如果你在類方面定義了方法(只能在類中調用),那麼即使有self引用了該類的對象。所以在Ruby中可能只使用self,你永遠不必寫下類的名字來表示接收者。重構時有一點幫助。

如果你有得到了這一切,看看Metaprogramming Ruby告訴你一些更多的花樣如何使用self,類eigenclasses和其他一些有趣的事情。

+0

這是最完整的例子,但不全面。我仍然沒有發現一個地方定義了_all_(真的,全部)使用ruby中的'self'的方法。 – wulftone

0

(由於這是評論...有點長)

事實上,你不能改變的self值,但是你可以在self,這是發生了什麼事在你的榜樣更改屬性。

讓我詳細說明。假設你有一個類Foo和你做這樣的事情:

f = Foo.new 
f.bar = 3 
puts f.bar # => 9 

2」?這裏實際發生的是,您在f上調用方法bar=,參數1。方法bar=可能看起來像這樣:

class Foo 
    def bar=(val) 
    @bar = val**2 # square the given value and assign it to the instance 
    end    # variable @bar 

    def bar 
    @bar   # return the instance variable @bar -- a shortcut for this is 
    end 

    # we could get rid of the second method, though, but using attr_reader: 
    attr_reader :bar 
end 

好吧,那麼這是怎麼回事?

f = Foo.new 
puts f[5] # => 10 

10」?!是的。再次,[]只是syntactic sugar一個普通的舊方法。事情是這樣的:

class Foo 
    def [](val) 
    val * 2 # Ruby just takes the value you put between [] and gives it to you as 
    end  # the first parameter 
end 

最後:

f = Foo.new 
f[:bar] = 99 
puts f[:bar] # => 100 

沒錯,你猜對了,這只是另一種方法調用。例如:

class Foo 
    @my_hash = {} 

    def []=(key, val)   # Ruby gives us the value between the [] as the first 
    @my_hash[key] = val + 1 # parameter and the value after the = as the second, 
    end      # and we use them to set a value on an internal 
          # instance variable... 
    def [](key) 
    @my_hash[key]   # ...and we can use the "getter" to get a value from 
    end      # the instance variable. 
end 

你說得對,這個東西並不是全都覆蓋在一個單一的,方便的來源,所以我希望這有助於。如果您需要進一步解釋,歡迎發表評論。

+0

這不完全是我問的,這也是相當可疑的做法...我會不希望'f [:bar] = 99'在我下次打電話時輸出100 - 另一個同樣適用於其他例如,你壓倒了「二傳手」普遍接受的行爲。我會做一個叫做'increment(key)'的函數,讓它增加'@ my_hash'。所以人們不會認爲你有一個好主意,並且錯過了這個問題。抱歉。 – wulftone

+0

我的回答不是描述我認爲任何人應該做的事情,而是像[[]'和'[] ='這樣的方法如何只是普通的方法調用。它並不回答你的問題 - 正如我們在評論中所討論的那樣 - 所以我不期望得到贊成,甚至不關心你的失望,但我不讚賞你的說法,我不「有一個好主意。 「這是*插圖*。你會知道更多的是寫出這個確切的代碼,而不是你命名一個類「Foo」,而且我認爲這對任何可能會出現並閱讀它的人都是顯而易見的。 –