Переопределение оператора обновления подстроки в классе Ruby's String - PullRequest
1 голос
/ 25 февраля 2011

Я хотел бы реализовать функциональную версию класса String.В частности, если вы обновляете подстроку, я хочу клонировать строку, выполните обновление и верните полученную новую строку, чтобы я мог связать / телескопировать операции.Функциональность легко закодировать:

class FString < String
  alias zap []=
  def update( i, v )
    print "\"#{self}\".update( #{i}, #{v} )\n"
    (c = self.dup).zap( i, v )
    c
  end
  def []=( i, v )
    print "\"#{self}\"[#{i}] = #{v}\n"
    self.update(i,v)
  end
end

a = FString.new "test"
b = a.update( 2..3, 'XX' )
c = (a[2..3] = 'XX')

print "#{a}\n#{b}\n#{c}\n"

Я застрял в том, что я хотел бы использовать мой метод обновления вместо оператора по умолчанию [] =.Но если вы запустите приведенный выше код, вы получите следующий вывод:

"test".update( 2..3, XX )
"test"[2..3] = XX
"test".update( 2..3, XX )
test
teXX
XX

Может кто-нибудь объяснить, почему использование метода update напрямую дает другие результаты по сравнению с использованием [] = (который сразу вызывает update)?

1 Ответ

0 голосов
/ 25 февраля 2011

Ошибка проста. См:

c = (a[2..3] = 'XX')

Метод [] = всегда возвращает второй аргумент, 'XX' (как любой метод, заканчивающийся =), потому что это оператор присваивания. Вам, вероятно, потребуется отменить определение []=, чтобы избежать этой ошибки.

...