1

我目前正在使用以下代码:

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

我想知道是否有一种巧妙的方法可以在一行中完成所有操作而无需额外的temp = []一行?如何将每个块执行的结果加入一个数组?

谢谢!

4

2 回答 2

5

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

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

看来您不熟悉函数式编程原理,这是一个可以帮助您的链接(特别是: see this)。每次你写一个each想法时,如果有一些替代方案(可以做一个像写文件这样的副作用,但更新变量通常是个坏主意)。

于 2012-07-10T21:10:45.873 回答
1

对于您提供的非常有限的语料库,您可以使用#scan将字符串解析为数组,然后将一系列切片转换为子数组。例如:

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

这在更一般的意义上是否有用取决于您。

于 2012-07-10T21:19:57.113 回答