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

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

我的arrays是:

 ["name1", "name2"] 

如果我做

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

结果是

 name1&name2 

我希望结果为

 &name1&name2 # Note the first "&" 

一个解决方案是

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

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

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

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

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

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

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

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

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

[编辑]

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

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

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

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

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

  1. 只是在元素之间?
  2. &之间的元素,并在开始之前?
  3. &之间的元素,并在结束后?
  4. &之间的元素,在开始之前和结束之后?
  5. &之间的元素, \n结束后?
  6. ? 在元素之前,在元素之间,以及\n结束之后?
  7. 如果没有元素,做一些特别的事情吗?

作为旁注,如果您尝试构建URL,则可能需要使用库而不是手动执行。

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

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

这适用于classes是否是类型Array