2010-07-29 185 views
0

Ruby代碼我是通過在一個字符串轉義庫一些代碼期待有一天,我遇到了一些代碼,看起來像這樣走過來:需要幫助理解從

class StringWrapper 
    class << self 
    alias new_no_dup new 
    def new(str) 
     new_no_dup(str.dup) 
    end 
    end 

    def initialize(str) 
    @str = str 
    end 

    ... 

end 

誰能解釋究竟是怎麼回事這裏?我瞭解類< <自我部分,但我不太理解別名new_no_dup的新方法,只能在下面的新方法中調用它?另外,你爲什麼認爲作者想以這種方式來做到這一點?

回答

3

通過將new_no_dup別名爲new,可以通過調用new_no_dup來調用原始的新功能。

StringWrapper.new方法在提供的字符串上調用duplicate(.dup),然後將該副本提供給原始的StringWrapper.new方法。

至於爲什麼,我會假設作者正試圖阻止原始字符串被改變。 StringWrapper將始終在內存中擁有它自己的字符串。

1

是否在字符串上使用.dup會影響就地修改(以!結尾的方法)是否會影響原始字符串。

作爲一個愚蠢的小示範...

irb(main):009:0> def shout(s) 
irb(main):010:1> local = s.dup 
irb(main):011:1> local.upcase! 
irb(main):012:1> puts local 
irb(main):013:1> end 
=> nil 
irb(main):014:0> greeting = "hi" 
=> "hi" 
irb(main):015:0> shout(greeting) 
HI 
=> nil 
irb(main):016:0> greeting 
=> "hi" 

如果您運行相同的片段,改變local = s.duplocal = s,那麼greeting終值將是"HI"因爲shout將具有改變greeting.dup返回原始字符串的副本,防止對原始的修改。