加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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]]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读