为什么在Ruby中,Array("foo\nbar") == ["foo\n", "bar"]?

4
在Ruby 1.8.7中,Array("hello\nhello")会给你["hello\n", "hello"]。这做了两件事情我没想到的:
  1. 它在换行符上分割了字符串。我期望它只是简单地给我一个数组,其中包含我传递的字符串作为其单个元素,而不修改我传递的数据。

  2. 即使你认为将字符串拆分并传递给数组是合理的,为什么它保留换行符,而"foo\nbar".split却没有保留呢?

此外:

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

3
值得一提的是,在 Ruby 1.9.1 中这已不再为真。现在完全没有进行任何拆分。 - Stéphan Kochen
反向兼容太棒了 :) (尽管 Ruby 的政策可能是在小版本号更改时破坏它,而不是主要版本。再次强调,任何约定都比没有好。) - badp
我猜这是为了让你可以写Array(File.read(filename)),这样它会按你的期望给你一个(未删除换行符的)行数组。 - glenn jackman
3个回答

1
它会在换行符处分割字符串。我期望它只是简单地给我一个数组,其中包含我传入的字符串作为其单个元素,而不修改我传入的数据。
这是一种和其他任何一种一样好的约定。例如,在Python中,list构造函数执行完全不同的操作:
>>> list("foo")
['f', 'o', 'o']

只要保持一致,我就看不出有什么问题。

即使你认为将字符串拆分并传递给数组是合理的,为什么它在 "foo\nbar".split 不保留换行符?

我的猜测(通过快速搜索和 TryRuby 支持)是字符串的 .split 方法这样做是为了使其成为数组的 .join 方法的“反向”操作。

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

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

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

0

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

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

不,实际上这意味着换行根本没有被解释。 - Stéphan Kochen
这正是泰森想要的,尽管它并没有回答为什么。 - Fahad Sadah

0

您可以尝试:

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

以及其他正则表达式。


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