为什么在Ruby中,Array(“foo \ bar”)== [“foo \ and”,“bar”]?

时间:2010-06-12 08:03:35

标签: ruby arrays string

在Ruby 1.8.7中,Array("hello\nhello")为您提供["hello\n", "hello"]。这样做有两件我不期望的事情:

  1. 它将字符串拆分为换行符。我希望它只是给我一个数组,其中我传入的字符串作为单个元素而不修改我传入的数据。

  2. 即使您接受在将字符串传递给Array时拆分字符串是合理的,为什么"foo\nbar".split没有时会保留换行符?

  3. 此外:

    >> Array.[] "foo\nbar"
    => ["foo\nbar"]
    >> Array.[] *"foo\nbar"
    => ["foo\n", "bar"]
    

3 个答案:

答案 0 :(得分:1)

  

它将字符串拆分为换行符。我希望它只是给我一个数组,其中我传入的字符串作为单个元素而不修改我传入的数据。

这是一项与其他任何公约一样好的公约。例如,Python中的list构造函数完全不同:

>>> list("foo")
['f', 'o', 'o']

只要它一致,我就不会发现问题。

  

即使你接受在将字符串传递给Array时拆分字符串是合理的,为什么在"foo\nbar".split没有时保留换行符?

我疯狂的猜测(由快速谷歌搜索和TryRuby支持)是字符串的.split方法这样做,使其成为数组的.join方法的“逆”操作。

>> "foospambar".split("spam").join("spam")
=> "foospambar"

顺便说一句,我无法在TryRuby上复制您的行为:

>> x = Array("foo\nbar")                                                         
=> ["foo\nbar"]   
>> Array.[] *"foo\nbar"                                                 
=> ["foo\nbar"]   

答案 1 :(得分:0)

如果用单引号替换双引号,它按预期工作:

>> Array.[] "foo\nbar"
=> ["foo\nbar"]
>> Array.[] 'foo\nbar'
=> ["foo\\nbar"]

答案 2 :(得分:0)

您可以尝试:

"foo\nbar".split(/w/)
"foo\nbar".split(/^/)
"foo\nbar".split(/$/)

和其他正则表达式。