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

史蒂文·L

我试图了解以下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方法的作用,也知道该inject方法的作用,但是我不确定两者如何链接在一起。到底是怎么回事?

我试图查看的文档each_with_index,然后猜测遇到问题的部分如下:“如果未给出任何块,则返回一个枚举数。”

我想所有这些归结为什么,什么是枚举器?

最高

一个枚举抽象枚举的想法,这样就可以使用所有的方便的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

因此,首先我们创建一个枚举器,该枚举器描述如何使用索引枚举。如果没有给出块,我们只返回枚举数。否则,我们告诉枚举each器使用该块进行枚举(这是做什么的)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章