需要帮助理解从

问题描述:

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的新方法,只能在下面的新方法中调用它?另外,你为什么认为作者想以这种方式来做到这一点?

通过将new_no_dup别名为new,可以通过调用new_no_dup来调用原始的新功能。

StringWrapper.new方法在提供的字符串上调用duplicate(.dup),然后将该副本提供给原始的StringWrapper.new方法。

至于为什么,我会假设作者正试图阻止原始字符串被改变。 StringWrapper将始终在内存中拥有它自己的字符串。

是否在字符串上使用.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返回原始字符串的副本,防止对原始的修改。