2010-06-12 46 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(/$/) 

和其他正則表達式。

相關問題