diff options
| author | ksss <[email protected]> | 2014-03-15 00:03:53 +0900 |
|---|---|---|
| committer | ksss <[email protected]> | 2014-03-15 08:15:16 +0900 |
| commit | 6b3cc0052d93983cd7cb9ee48a3c4c140046fc2a (patch) | |
| tree | 24443202e4504aa2f8dc0bfadd2cb48f45125ddf /mrbgems/mruby-enumerator | |
| parent | 47fc784b567d58c48ad1f018e3b56926acd76725 (diff) | |
| download | mruby-6b3cc0052d93983cd7cb9ee48a3c4c140046fc2a.tar.gz mruby-6b3cc0052d93983cd7cb9ee48a3c4c140046fc2a.zip | |
fix self modifying bug
Diffstat (limited to 'mrbgems/mruby-enumerator')
| -rw-r--r-- | mrbgems/mruby-enumerator/mrblib/enumerator.rb | 5 | ||||
| -rw-r--r-- | mrbgems/mruby-enumerator/test/enumerator.rb | 21 |
2 files changed, 24 insertions, 2 deletions
diff --git a/mrbgems/mruby-enumerator/mrblib/enumerator.rb b/mrbgems/mruby-enumerator/mrblib/enumerator.rb index 8641d99e0..cf909bac5 100644 --- a/mrbgems/mruby-enumerator/mrblib/enumerator.rb +++ b/mrbgems/mruby-enumerator/mrblib/enumerator.rb @@ -255,6 +255,7 @@ class Enumerator # enum.each(:y, :z) { |elm| elm } #=> :method_returned # def each *argv, &block + obj = self if 0 < argv.length obj = self.dup args = obj.args @@ -264,9 +265,9 @@ class Enumerator else args = argv.dup end - @args = args + obj.args = args end - return self unless block_given? + return obj unless block_given? enumerator_block_call(&block) end diff --git a/mrbgems/mruby-enumerator/test/enumerator.rb b/mrbgems/mruby-enumerator/test/enumerator.rb index bbb22ee6d..2c85feef3 100644 --- a/mrbgems/mruby-enumerator/test/enumerator.rb +++ b/mrbgems/mruby-enumerator/test/enumerator.rb @@ -89,6 +89,27 @@ assert 'Enumerator#each' do assert_equal([1], ary) end +assert 'Enumerator#each arguments' do + obj = Object.new + + def obj.each_arg(a, b=:b, *rest) + yield a + yield b + yield rest + :method_returned + end + + enum = obj.to_enum :each_arg, :a, :x + + assert_equal [:a, :x, []], enum.each.to_a + assert_true enum.each.equal?(enum) + assert_equal :method_returned, enum.each { |elm| elm } + + assert_equal [:a, :x, [:y, :z]], enum.each(:y, :z).to_a + assert_false enum.each(:y, :z).equal?(enum) + assert_equal :method_returned, enum.each(:y, :z) { |elm| elm } +end + assert 'Enumerator#next' do e = 3.times 3.times { |i| |
