我试图了解以下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] 删除。
我来说两句