2012-07-10 17 views
1

我目前使用下面的代碼:將塊的結果連接到沒有temp變量的數組中?

text = "a, 1; b, 2" 
temp = [] 
text.gsub(/\s+/, "").split(";").each {|x| temp << x.split(",")} 
temp # => [["a","1"],["b","2"]] 

我不知道是否有得到這個工作都在一條線路沒有額外temp = []線光滑的方法是什麼?如何將每個塊的執行結果加入到一個數組中?

謝謝!

回答

5

Enumerable模塊是任何Ruby新手必讀的。使用Enumerable#map代替:

text.gsub(/\s+/, "").split(";").map { |x| x.split(",") } 
#=> [["a", "1"], ["b", "2"]] 

看來你不熟悉函數式編程的原則,在這裏它是一個link它可以幫助您(具體爲:see this)。每當你寫一個each時,請考慮是否有其他選擇(可以像寫文件那樣做副作用,但更新變量通常是個壞主意)。

+0

'text.split(「;」).map {| x | x.split(「,」)}',避免了一個額外的字符串,是一個選項。 – steenslag 2012-07-10 21:57:55

+0

@tokland謝謝!你(或其他人)是否知道一組練習(類似於教科書),以便用於在Ruby或任何其他語言中練習這些函數式編程技術? – 2012-07-11 21:02:18

+1

「Ruby最佳實踐」在FP上有一章:http://my.safaribooksonline.com/book/web-development/ruby/9780596157487/functional-programming-techniques/i_sect15_d1e7222。請查看這個偉大的視頻:http://vimeo.com/6701329。 Ruby不是一種功能語言,所以沒有太多的材料。你總是可以學習Haskell或Erlang或Scala或OCaml。 – tokland 2012-07-11 21:09:23

1

對於您提供的非常有限的語料庫,可以使用#scan將字符串解析爲數組,然後將一系列切片轉換爲子數組。例如:

"a, 1; b, 2".scan(/\w+/).each_slice(2).to_a 
=> [["a", "1"], ["b", "2"]] 

無論這是否在更廣泛的意義上是有用的取決於您。