将块的结果连接到没有临时变量的数组中?

时间:2012-07-10 21:07:41

标签: ruby

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

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

我想知道是否有一种灵活的方法可以在没有额外temp = []行的情况下在一行中完成所有操作?如何将每个块执行的结果加入到数组中?

谢谢!

2 个答案:

答案 0 :(得分:5)

任何Ruby新手都必须阅读Enumerable模块。请改用Enumerable#map

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

看起来你不熟悉函数式编程原理,这里它可以帮助你link(具体来说:see this)。每次你写each时都会想到是否有其他选择(可以像编写文件一样做副作用,但更新变量通常是个坏主意。)

答案 1 :(得分:1)

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

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

这是否在更广泛的意义上有用取决于你。