2010-07-29 2 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

С помощью aliasing new_no_dup для нового можно вызвать новую функциональность, вызвав new_no_dup.

Метод StringWrapper.new вызывает дубликат (.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.dup к local = s, то окончательное значение greeting будет "HI" потому shout будут изменены greeting. .dup возвращает копию оригинальной строки, предотвращая модификации оригинала.

Смежные вопросы