a=[11,22,31,224,44].to_enum
=> #<Enumerator: [11, 22, 31, 224, 44]:each>
a.select.with_index{|x| puts x if x<2 }
=> []
a.with_index(2)
=> #<Enumerator: #<Enumerator: [11, 22, 31, 224, 44]:each>:with_index(2)>
irb(main):011:0> a.with_index(2){|x| puts x if x==224}
224
=> [11, 22, 31, 224, 44]
a.with_index(2){|x| puts x if x < 224}
11
22
31
44
=> [11, 22, 31, 224, 44]
混淆: 在这里,我将起始偏移设置为2
。但是如果我们查看输出 - 如何{{1}来
而不是11
。由于31
位于31
位置。
2th
混淆: 此处我已将起始偏移设置为a.with_index(2){|x| puts x if x > 224}
=> [11, 22, 31, 224, 44]
a.with_index(1){|x| puts x if x > 224}
=> [11, 22, 31, 224, 44]
a.with_index(1){|x| puts x if x < 224}
11
22
31
44
=> [11, 22, 31, 224, 44]
a.with_index(1){|x| puts x if x < 224}
11
22
31
44
=> [11, 22, 31, 224, 44]
。但是,如果我们查看输出 - 如何{{1而不是1
。由于11
位于22
位置。
在考虑所有事实的同时,我想知道即使我们提到了起始偏移 - 为什么22
没有从上述偏移开始评估?
注意: 是否有直接方法打印1st
内容?
答案 0 :(得分:4)
Enumerator#with_index有令人困惑的文档,但希望这会让它更清晰。
a=[11,22,31,224,44].to_enum
=> [11, 22, 31, 224, 44]
a.with_index { |val,index| puts "index: #{index} for #{val}" }
index: 0 for 11
index: 1 for 22
index: 2 for 31
index: 3 for 224
index: 4 for 44
a.with_index(2) { |val,index| puts "index: #{index} for #{val}" }
index: 2 for 11
index: 3 for 22
index: 4 for 31
index: 5 for 224
index: 6 for 44
正如您所看到的,它实际上做的是偏移索引,而不是从给定索引开始迭代。