混淆与枚举#with_index - 起始偏移索引

时间:2013-02-02 21:26:03

标签: ruby ruby-1.9.3

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内容?

1 个答案:

答案 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

正如您所看到的,它实际上做的是偏移索引,而不是从给定索引开始迭代。