如何将一个字符加入到数组的开头并形成一个新的字符串?

3

我正在使用 Ruby on Rails 3,尝试使用 & 字符将数组连接起来。我在 Ruby 文档中查看了相关信息

我的数组是:

["name1", "name2"]

如果我执行

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

IT结果如下:

name1&name2

I would like that results as

&name1&name2 # Note the first "&"

一种解决方案是

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

但我认为这不是一个“正确的方法”。

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

6个回答

14

连接(join)的目的在于仅获取连接项之间的字符。你想要在每个项目之前加上一个字符。我不知道有什么简短的方法,但更自然的方式似乎是将它们映射(map)并在没有分隔符的情况下连接(join)它们:

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

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

这种方法在调整后也可以很好地处理更多的项目。例如,使用list.join("\n- ").prepend("- ")创建一个带有项目符号的项目列表。 - Dennis

1
另一种替代方案:您可以使用{{link1:Enumerable#inject}}来构建字符串。
["name1", "name2"].inject("") { |str, elem| str += "&#{elem}" }

[编辑]

作为一个完美主义者,我必须补充一点,如果您多次修改字符串,可能会导致性能不佳。如果您有一个大数组,可以使用 StringIO

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

1
有时候我有相反的需求。我有时想在连接起来的字符串后面放置某个特定字符。为了做到这一点,我通常会这样做:
["name1", "name2"].join("&") + "&"

如果你在想“为什么Ruby不实现在开头添加元素的能力?”,我的回答是,如果要处理这种情况,会有太多的可能性需要考虑:

  1. 只在元素之间加上 &
  2. 在元素之间和开始之前加上 &
  3. 在元素之间和结束之后加上 &
  4. 在元素之间、开始之前和结束之后都加上 &
  5. 在元素之间加上 & ,并在结束后加上 \n
  6. 在元素之前加上 ? ,在元素之间加上 & ,并在结束后加上 \n
  7. 如果没有元素,是否需要做一些特殊处理?

顺便说一下,如果你想构建一个URL,最好使用库而不是手动操作。


0

Join 的作用不是在字符串前添加内容。这里有另一个选项:

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

即使 empty?,此代码将始终返回 & - New Alexandria

0
您提供的答案稍作修改后,可能会更加节省计算资源,尤其是在处理大型数组时。
(['']+Array.wrap(classes)).join('&')

无论 classes 是否为类型 Array,此方法均有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接