Я ищу более элегантный способ объединения строк в Ruby.
У меня есть следующая строка:
source = "#{ROOT_DIR}/" << project << "/App.config"
Есть ли лучший способ сделать это?
И в этом отношении, в чем разница между <<
и +
?
ruby
string-concatenation
dagda1
источник
источник
Ответы:
Вы можете сделать это несколькими способами:
<<
но это не обычный способСо строковой интерполяцией
с
+
Второй метод кажется более эффективным с точки зрения памяти / скорости из того, что я видел (хотя и не измерялось). Все три метода выдают неинициализированную постоянную ошибку, когда ROOT_DIR равен nil.
При работе с путевыми именами вы можете использовать их,
File.join
чтобы избежать путаницы с разделителем путевых имен.В конце концов, это вопрос вкуса.
источник
+
Оператор нормальный выбор конкатенации, и, вероятно , самый быстрый способ конкатенации строк.Разница между
+
и<<
заключается в том,<<
что объект изменяется с левой стороны, а+
не изменяется .источник
+
и<<
будет примерно одинаковой. Если вы имеете дело со многими или очень большими строками, то вы можете заметить разницу. Я был удивлен тем, насколько похожи они выступили. gist.github.com/28953115.times do ... end
блок) для каждого интерпретатора, вы получите более точные результаты. Мое тестирование показало, что интерполяция - самый быстрый метод среди всех интерпретаторов Ruby. Я ожидал<<
бы быть самым быстрым, но именно поэтому мы тестируем.Если вы просто объединяете пути, вы можете использовать собственный метод File.join в Ruby.
источник
с http://greyblake.com/blog/2012/09/02/ruby-perfomance-tricks/
Использование
<<
akaconcat
намного эффективнее+=
, поскольку последний создает временный объект и переопределяет первый объект новым объектом.вывод:
источник
Поскольку это путь, я бы, вероятно, использовал массив и соединение:
источник
Вот еще один ориентир, вдохновленный этой сущностью . Он сравнивает concatenation (
+
), appending (<<
) и interpolation (#{}
) для динамических и предопределенных строк.вывод:
Вывод: интерполяция в МРТ тяжелая.
источник
Я бы предпочел использовать Pathname:
о
<<
и+
из рубиновых документов:+
: Возвращает новую строку, содержащую other_str, соединенную с str<<
: Объединяет данный объект на ул. Если объект является Fixnum между 0 и 255, он преобразуется в символ перед конкатенацией.так что разница в том, что становится первым операндом (
<<
вносит изменения на месте,+
возвращает новую строку, так что она становится тяжелее в памяти), и то, что будет, если первый операнд будет Fixnum (<<
будет добавлено, как если бы это был символ с кодом, равным этому числу,+
повысит ошибка)источник
Pathname('/home/foo') + '/etc/passwd' # => #<Pathname:/etc/passwd>
. Это разработано на основе примера Rubydoc. Кажется, что File.join безопаснее.(Pathname(ROOT_DIR) + project + 'App.config').to_s
если вы хотите вернуть строковый объект.Позвольте мне показать вам весь мой опыт с этим.
У меня был запрос, который возвращал 32 тыс. Записей, для каждой записи я вызывал метод для форматирования этой записи базы данных в форматированную строку и затем объединял ее в строку, которая в конце всего этого процесса превращается в файл на диске.
Моя проблема заключалась в том, что, согласно записи, около 24 тыс., Процесс конкатенации строки включал боль.
Я делал это, используя обычный оператор «+».
Когда я перешел на «<<», это было похоже на магию. Было действительно быстро.
Итак, я вспомнил свои старые времена, вроде 1998 года, когда я использовал Java и конкатенировал String с помощью '+' и изменил с String на StringBuffer (и теперь у нас, разработчика Java, есть StringBuilder).
Я считаю, что процесс + / << в мире Ruby такой же, как + / StringBuilder.append в мире Java.
Первые перераспределяют весь объект в памяти, а другие просто указывают на новый адрес.
источник
Сцепление говорите? Как насчет
#concat
метода тогда?Справедливости ради,
concat
псевдоним как<<
.источник
"foo" "bar" 'baz" #=> "foobarabaz"
Вот еще несколько способов сделать это:
И так далее ...
источник
Вы также можете использовать
%
следующее:Этот подход также работает с
'
(одинарной) кавычкой.источник
Вы можете использовать оператор
+
или<<
оператор, но в Ruby.concat
функция является наиболее предпочтительной, поскольку она намного быстрее, чем другие операторы. Вы можете использовать это как.источник
.
после вашего последнегоconcat
нет?Ситуация имеет значение, например:
В первом примере объединение с
+
оператором не будет обновлятьoutput
объект, однако во втором примере<<
оператор будет обновлятьoutput
объект с каждой итерацией. Таким образом, для ситуации вышеупомянутого типа,<<
лучше.источник
Вы можете объединить в определении строки напрямую:
источник
Для вашего конкретного случая вы также можете использовать
Array#join
при построении пути к файлу тип строки:Это имеет приятный побочный эффект автоматического преобразования различных типов в строку:
источник
Для кукол:
источник