需要帮助理解从
问题描述:
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.dup
到local = s
,那么greeting
终值将是"HI"
因为shout
将具有改变greeting
。 .dup
返回原始字符串的副本,防止对原始的修改。