2010-06-12 86 views
4

在Ruby 1.8.7中,Array("hello\nhello")给你["hello\n", "hello"]。这是我不期望的两件事:为什么在Ruby中,Array(“foo nbar”)== [“foo n”,“bar”]?

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

  2. 即使您接受将字符串传递给Array时合理分割字符串为什么在"foo\nbar".split不保留换行符?

此外:

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

FWIW,这不再是真实的1.9.1。根本没有分裂。 – 2010-06-12 08:13:33

+0

Yay为了向后兼容:)(尽管Ruby的策略可能是在小的版本号变化上打破它,而不是主要的。再一次,任何约定都是好的,比任何其他约好。) – badp 2010-06-12 08:25:04

+0

我想这个所以你可以写'Array(File.read(filename))',并且它会给你一个你想象中的(unchomped)行数组。 – 2010-06-12 11:20:30

回答

1

它拆分换行符上的字符串。我期望它只是简单地给我一个数组,其中包含我传递的字符串作为其单个元素,而不修改我传入的数据。

这是一个与其他任何方式一样好的约定。例如,list构造在Python做完全不同的事情:

>>> 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"] 
+0

不,实际上,这意味着换行符根本不被解释。 – 2010-06-12 08:13:12

+0

这是泰森想要的,尽管它没有回答原因。 – 2010-06-12 08:14:08

0

你可以试试:

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

和其他正则表达式。

相关问题