Нужна помощь в понимании кода Ruby из - PullRequest
0 голосов
/ 29 июля 2010

На днях я просматривал некоторый код в библиотеке escape-строки и наткнулся на код, который выглядит следующим образом:

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

Может кто-нибудь объяснить, что именно здесь происходит? Я понимаю до класса << self part, но я не совсем понимаю, как наложить псевдоним на метод, новый для new_no_dup, только для вызова его в новом методе ниже? Кроме того, как вы думаете, почему автор хочет сделать это таким образом? </p>

Ответы [ 2 ]

3 голосов
/ 29 июля 2010

Путем наложения псевдонима new_no_dup на новый, можно вызвать исходную новую функциональность, вызвав new_no_dup.

Метод StringWrapper.new вызывает дубликат (.dup) для предоставленной строки и затем предоставляет эту копию в исходный метод StringWrapper.new.

Что касается причины, я бы предположил, что авторпытаясь предотвратить изменение исходной строки.StringWrapper всегда будет иметь свою собственную строку в памяти.

1 голос
/ 29 июля 2010

Используете ли вы .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 возвращает копию оригинальной строки, предотвращая изменения оригинала.

...