Я хотел бы реализовать функциональную версию класса 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)?