0

奇妙な行動に気付きました。これは期待どおりに実行されますが:

@a = ['0','1','2','3','4','5']
def test2
  @a[0..2].each do |i|
    puts 'I am at: ' +i.to_s
    if i == '2'
      puts 'I am removing 2'
      @a.delete(i)
      licz
    end
  end
end


I am at: 0
I am at: 1
I am at: 2
I am removing 2
I am at: 0
I am at: 1
I am at: 3

どういうわけか、このコードは古い配列を「記憶」し、前の「if」ステートメントを終了しようとします。

@a = ['0','1','2','3','4','5']
def test1
  @a.each do |i|
    puts 'I am at: ' +i.to_s
    if i == '2'
      puts 'I am removing 2'
      @a.delete(i)
      test1
    end
  end
end
    I am at: 0
    I am at: 1
    I am at: 2
    I am removing 2
    I am at: 0
    I am at: 1
    I am at: 3
    I am at: 4
    I am at: 5
    I am at: 4
    I am at: 5
    => ["0", "1", "3", "4", "5"]

4 5, 4 5 を繰り返すのはなぜですか?

2番目のテストでは、各要素でそれぞれを実行していることは承知していますが、なぜ古いステートメントを終了しようとするのですか?

4

1 に答える 1

3

同じ関数 (test1) を 2 回呼び出すためです。

于 2012-05-13T15:49:40.973 に答える