我试图理解以下 Ruby 代码:
digits.each_with_index.inject(0) do |decimal, (digit, index)|
decimal + digit * 2**index
end
Run Code Online (Sandbox Code Playgroud)
(作为参考,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!
Run Code Online (Sandbox Code Playgroud)
枚举器的一个很酷的事情是它们本身是可枚举的,并且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
Run Code Online (Sandbox Code Playgroud)
因此,首先我们创建一个枚举器,它描述如何使用索引进行枚举。如果没有给出块,我们只需返回枚举器。否则,我们告诉枚举器each使用该块进行枚举(这就是所做的)。
| 归档时间: |
|
| 查看次数: |
676 次 |
| 最近记录: |