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

在Ruby中,返回“可枚举”是什么意思

发布时间:2020-12-17 02:23:57 所属栏目:百科 来源:网络整理
导读:我试图理解以下 Ruby代码: digits.each_with_index.inject(0) do |decimal,(digit,index)| decimal + digit * 2**index end (作为参考,digits是一种返回数组的方法,其中每个元素都是一个整数). 令我困惑的代码部分是.each_with_index.inject(0).我知道each_
我试图理解以下 Ruby代码:

digits.each_with_index.inject(0) do |decimal,(digit,index)|
      decimal + digit * 2**index
    end

(作为参考,digits是一种返回数组的方法,其中每个元素都是一个整数).

令我困惑的代码部分是.each_with_index.inject(0).我知道each_with_index方法的作用,我知道注入方法的作用,但我不确定两者的链接是如何工作的.到底发生了什么?

我试着查看each_with_index的文档,我猜我遇到问题的部分如下:“如果没有给出块,则返回一个枚举器.”

我想这一切归结为什么是一个普查员?

解决方法

Enumerator抽象了枚举的概念,以便您可以使用所有方便的Enumerable方法,而无需关心底层数据结构是什么.

例如,您可以使用枚举器来创建一个类似于无限数组的对象:

squares = Enumerator.new do |yielder|
  x = 1
  loop do
    yielder << x ** 2
    x += 1
  end
end

squares.take(10)
# [1,4,9,16,25,36,49,64,81,100]
squares.count
# don't wait up for this one!

关于枚举器的一个很酷的事情是它们本身是可枚举的,如果你不给它们一个块,大多数Enumerable方法都会返回枚举器.这是允许您链接方法调用以获取一个大枚举器的原因.

这是我如何编码each_with_index,以便它可以很好地链接:

class Array
  def my_each_with_index &blk
    e = Enumerator.new do |yielder|
      i = 0
      each do |x|
        yielder << [x,i]
        i += 1
      end
    end

    return e unless blk
    e.each(&blk)
  end
end

[3,2,1].my_each_with_index { |x,i| puts "#{i}: #{x}" }
# 0: 3
# 1: 2
# 3: 1

首先,我们创建一个枚举器,描述如何枚举索引.如果没有给出块,我们只返回枚举器.否则,我们告诉枚举器使用块枚举(每个人都做了).

(编辑:李大同)

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

    推荐文章
      热点阅读