«Наилучшее» во многом зависит от вашего варианта использования, но рассмотрим следующий код:
a = 'shirts'
b = a
params = {}
params[:id] = b
params[:id] << '/'
params[:id] #=> "shirts/"
Как и следовало ожидать, <<
добавил косую черту, но ...
a #=> "shirts/"
# a has changed too!
Так что, в зависимости от вашего уровня понимания этих методов, такое поведение вы можете не ожидать.Сравните с:
params[:id] += '/'
params[:id] #=> "shirts/"
a #=> "shirts"
# a remains the same
По сути, некоторые методы создают новые объекты, а другие изменяют существующие.Мы можем проверить это с помощью метода object_id .
str1 = 'a'
str2 = str1
str1.object_id #=> 14310680
str2.object_id #=> 14310680
# Both str1 and str2 point to the same object
Теперь
str1 << 'b' #=> "ab"
str1.object_id #=> 14310680
str2 #=> "ab"
Мы успешно изменили str1 без создания нового объекта и, поскольку str2 по-прежнему указываетк тому же объекту он также получает «обновление».Наконец, если мы используем метод +=
:
str1 #=> "ab"
str1 += '' #=> "ab"
str1.object_id #=> 15078280
str2.object_id #=> 14310680
Обратите внимание, что мы ничего не добавили к str1, но он по-прежнему создает новый объект.