需要帮助理解一些Ruby代码

时间:2010-07-29 16:45:29

标签: ruby singleton alias

前几天我在字符串转义库中查看了一些代码,我遇到了一些看起来像这样的代码:

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

有人能解释到底发生了什么吗?我理解了班级&lt;&lt;自我部分,但我不太明白别名new_no_dup的新方法,只是在下面的新方法中调用它?另外,为什么你认为作者想以这种方式做到这一点?

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分: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.dup更改为local = s,那么greeting的最终值将为"HI",因为shout已修改{ {1}}。 greeting会返回原始字符串的副本,从而无法修改原始字符串。