如何“加入”一个数组,在结果字符串的开头添加第一个要加入的字符?

时间:2011-02-20 15:35:10

标签: ruby-on-rails ruby arrays ruby-on-rails-3 join

我正在使用Ruby on Rails 3,我正在尝试使用join字符的&数组。我阅读了Ruby文档about that

我的数组是:

["name1", "name2"]

如果我这样做

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

结果为

name1&name2

我希望结果为

&name1&name2 # Note the first "&"

解决方案

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

但我认为这不是“正确的方式”。

那么,如何在不使用&name1&name2的情况下["", "name1", "name2"].join("&")

6 个答案:

答案 0 :(得分:12)

整个加入点是你只在连接的项目之间获得字符。你想要每个项目前面的一个。我不知道一个简短的方法,但只是映射它们然后在没有分隔符的情况下加入它们似乎更自然:

["name1", "name2"].map{|item| '&'+item}.join

答案 1 :(得分:1)

Join意味着不添加字符串。这是另一种选择:

"&#{["name1","name2"].join("&")}"

答案 2 :(得分:1)

另一种替代解决方案:您可以使用Enumerable#inject来构建字符串。

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

[编辑]

要成为一个完成主义者,我必须补充一点,你不应该忘记,如果你做了很多次,那么一遍又一遍地修改一个字符串会导致性能不佳。如果您有一个大型数组,则可以使用StringIO

require 'stringio'
["name1", "name2"].inject(StringIO.new) { |str, elem| str << "&#{elem}" }.to_s

答案 3 :(得分:1)

我有时候会有相反的要求。我有时想在连接字符串之后添加某个字符。要做到这一点,我通常会做

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

如果你想知道“为什么Ruby在开始时没有实现添加内容的能力?”,我的答案是,如果要处理这种情况,那么有太多的可能性需要考虑:

  1. 在元素之间只有&
  2. 在元素之间和开始之前有&吗?
  3. 元素之间是否&,结束之后?
  4. 在元素之间,开始之前和结束之后有&吗?
  5. 元素之间有&,结尾之后有\n吗?
  6. 元素之前有?,元素之间有&,结尾之后有\n吗?
  7. 如果没有元素,可以做一些特别的事吗?
  8. 作为旁注,如果您尝试构建URL,则可能需要使用库而不是手动执行。

答案 4 :(得分:0)

考虑到数组的大小,您提供的答案稍有修改可能会减少计算量。

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

这适用于classes是否为Array

类型

答案 5 :(得分:0)

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