Как я могу «присоединиться» к массиву, добавив в начало результирующей строки первый символ для соединения? - PullRequest
3 голосов
/ 20 февраля 2011

Я использую Ruby on Rails 3 и пытаюсь join массив с символом &.Я прочитал документацию Ruby об этом .

Мой массив:

["name1", "name2"]

Если я сделаю

["name1", "name2"].join("&")

, то получится

name1&name2

Мне бы хотелось, чтобы это было

&name1&name2 # Note the first "&"

Решение -

["", "name1", "name2"].join("&")

, но я думаю, что это не "правильный путь".

Итак, как я могу получить &name1&name2 без использования ["", "name1", "name2"].join("&")?

Ответы [ 6 ]

12 голосов
/ 20 февраля 2011

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

["name1", "name2"].map{|item| '&'+item}.join
1 голос
/ 21 февраля 2011

У меня иногда есть противоположное требование.Иногда я хочу поставить определенный символ после объединенной строки.Чтобы сделать это, я обычно делаю

["name1", "name2"].join("&") + "&"

Если вы задаетесь вопросом «Почему в Ruby не реализована возможность добавлять что-то в начале?», Я отвечаю, что, если собирался справиться с этимсценария, было бы слишком много возможностей для рассмотрения:

  1. Просто иметь & между элементами?
  2. Есть & между элементами и до начала?
  3. Есть ли & между элементами и после конца?
  4. Имеется & между элементами и до начала и после конца?
  5. Есть &между элементами и \n после конца?
  6. Имеете ? перед элементами, & между элементами и \n после конца?
  7. Сделайте что-то особенное, еслиэлементов нет?

В качестве примечания: если вы пытаетесь создать URL, вы можете использовать библиотеку, а не делать это вручную.

1 голос
/ 20 февраля 2011

Другое альтернативное решение: вы можете использовать Enumerable#inject для построения строки.

["name1", "name2"].inject("") { |str, elem| str += "&#{elem}" }

[редактировать]

Чтобы быть завершителем, я должен добавить, что вы не должны забывать, что изменение строки снова и снова может привести к плохой производительности, если вы делаете это много, много раз. Если у вас большой массив, вы можете использовать StringIO:

require 'stringio'
["name1", "name2"].inject(StringIO.new) { |str, elem| str << "&#{elem}" }.to_s
1 голос
/ 20 февраля 2011

Присоединение означает, что он не должен предшествовать строке. Вот еще один вариант:

"&#{["name1","name2"].join("&")}"
0 голосов
/ 11 января 2019
["name1", "name2"].join('&').prepend('&')
0 голосов
/ 11 июля 2013

Слегка измененная форма ответа, который вы предоставили, может быть менее трудоемкой, учитывая размер вашего массива.

(['']+Array.wrap(classes)).join('&')

Это работает для того, является ли classes типом Array

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...