前几天我在字符串转义库中查看了一些代码,我遇到了一些看起来像这样的代码:
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的新方法,只是在下面的新方法中调用它?另外,为什么你认为作者想以这种方式做到这一点?
答案 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
会返回原始字符串的副本,从而无法修改原始字符串。