Я написал функцию, которая выполняет итерацию по символу строки символом, вытягивая значения из хэша, используя каждый символ в качестве ключа. Значения в хэш были использованы для создания новой строки:Почему << и + = построение другой строки?
acc = ''
str.each_char do |c|
acc << somehash[c]
end
Если строка была больше, чем один, то первый символ смотрелась бы и его хэш-значение интерполировать несколько раз во встроенной строке, которая была не то, что я хотел. Я переписал линию с <<
в
acc += somehash[c]
и правильно себя вели. Почему у меня другое поведение от <<
и +=
?
ПРИМЕЧАНИЕ. Я больше не получаю такое поведение, и мои модульные тесты проходят. Я не уверен, почему, так как я не касался логики в цикле.
[ 'Струнный # <<'] (http://ruby-doc.org/core-2.2.2/String.html#method-i- 3C-3C) использует ту же строку: 'str = str + 'a'' переназначает результат только что созданному объекту строкой. Я не могу понять, как ваш код мог бы создать описанное вами поведение. – mudasobwa
Честно говоря, я бы пошел с 'acc = str.chars.map {| c | somehash [c]}. join' он чище и даст тот же результат. Или еще лучше 'acc = somehash.values_at (* str.split (//)). Join' – engineersmnky
@mudasobwa Да, вот что я подумал. Я всегда пользовался «<<» счастливо до сегодняшнего дня, когда мои юнит-тесты выявили странную интерполяцию. – labyrinth