Ruby:枚举器链
发布时间:2020-12-17 02:54:18 所属栏目:百科 来源:网络整理
导读:最初我打算做以下事情: arr = [[1,2],[3,4]]new_arr = arr.map do |sub_arr| sub_arr.map do |x| x+1 endendp new_arr 输出: [[2,3],[4,5]] 但后来我试图通过“链接”调查员来缩短它: arr.map.map{|x| x+1} 然后它给出错误的to_ary方法丢失 我调试了它 ar
最初我打算做以下事情:
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方法丢失 我调试了它 arr.each.each{|x| p x} 输出: [1,2] [3,4] ,这是原始数组,只取消了一次. 如何将两个地图/每个枚举器链接起来,以便将枚举器分成两个(或更多)级别?或者它必须在块中? 更新: 经过一些搜索,显然是一个链obj.Enumerator.Enumerator.Enumerator …只枚举一次obj,只有1级深度.为了更深入,需要阻止.我制定了简单的代码,将字符串转换为块(Proc / Lambda;类似于符号到块但更多地使用;更像是函数语法),以便避免使用块.有人有类似的代码字符串#to_proc但我找不到它,其中的x,y的东西不符合我的口味.我用$0,$1,$2,…… 示例代码(前面的示例将写为): arr = [[1,4]] new_arr = arr.map(&'[$0+1,$1+1]') p new_arr 我稍后会将原始代码推送到github.你可以使用聊天联系我,如果你想在那之前看到它,因为我真的拖延:) 解决方法
也许您需要一张只想在树叶上应用的地图:
module Enumerable def nested_map &block map{|e| case e when Enumerable e.nested_map(&block) else block.call(e) end } end end p [[1,4]].nested_map(&:succ) #=> [[2,5]] 或者只适用于嵌套结构的第n级的地图. module Enumerable def deep_map level,&block if level == 0 map(&block) else map{|e| e.deep_map(level - 1,&block)} end end end p [[1,4]].deep_map(1,&:succ) #=> [[2,5]] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |