最初我打算做如下的事情:
arr = [[1,2],[3,4]]
new_arr =
arr.map do |sub_arr|
sub_arr.map do |x|
x+1
end
end
p new_arr
输出:
[[2,3],[4,5]]
但后来我试图通过“链接”枚举器来缩短它:
arr.map.map{|x| x+1}
然后它给出错误to_ary method missing
我调试了它
arr.each.each{|x| p x}
输出:
[1,2]
[3,4]
,这是原始数组,仅被解剖一次。
如何链接两个地图/每个枚举器,以便将枚举器分成 2 个(或更多)级别?还是必须在区块中?
更新:
经过一番搜索,显然一个链obj.Enumerator.Enumerator.Enumerator...
只枚举了 obj 一次,并且只有 1 级深度。为了更深入,需要阻塞。我编写了简单的代码,将字符串转换为块(Proc/Lambda;类似于符号到块,但更有用;更像是一种函数式语法),这样就可以避免该块。有人有类似的代码String#to_proc
,但我找不到,而且里面的x,y
东西不符合我的口味。我用$0,$1,$2,...
示例代码(前面的例子会写成):
arr = [[1,2],[3,4]]
new_arr = arr.map(&'[$0+1,$1+1]')
p new_arr
我稍后会将原始代码推送到github。如果您想在那之前看到它,您可以使用聊天与我联系,因为我真的很拖延:)