summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-03-24 18:39:06 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-03-24 18:39:06 +0900
commitc326ab877e8e9d04b672d14b37c7d5fa96d04e7b (patch)
treeb30c9487e551457f1a311d8672820bf7069b7469
parent23610d548956cc2ba92fada791ac1de1b1026192 (diff)
downloadmruby-c326ab877e8e9d04b672d14b37c7d5fa96d04e7b.tar.gz
mruby-c326ab877e8e9d04b672d14b37c7d5fa96d04e7b.zip
improve Enumerable#reverse_each to be efficient
-rw-r--r--mrbgems/mruby-array-ext/mrblib/array.rb10
-rw-r--r--mrbgems/mruby-enum-ext/mrblib/enum.rb4
2 files changed, 12 insertions, 2 deletions
diff --git a/mrbgems/mruby-array-ext/mrblib/array.rb b/mrbgems/mruby-array-ext/mrblib/array.rb
index 337cef632..feec10ead 100644
--- a/mrbgems/mruby-array-ext/mrblib/array.rb
+++ b/mrbgems/mruby-array-ext/mrblib/array.rb
@@ -201,4 +201,14 @@ class Array
self.replace(result)
end
end
+
+ # for efficiency
+ def reverse_each(&block)
+ i = self.size - 1
+ while i>=0
+ block.call(self[i])
+ i -= 1
+ end
+ self
+ end
end
diff --git a/mrbgems/mruby-enum-ext/mrblib/enum.rb b/mrbgems/mruby-enum-ext/mrblib/enum.rb
index 6ac1812ee..0ce1d7605 100644
--- a/mrbgems/mruby-enum-ext/mrblib/enum.rb
+++ b/mrbgems/mruby-enum-ext/mrblib/enum.rb
@@ -519,8 +519,8 @@ module Enumerable
def reverse_each(&block)
ary = []
- self.each {|*val| ary.unshift(*val) }
- ary.each {|*val| block.call(*val) }
+ self.each {|*val| ary.push(val.__svalue) }
+ ary.reverse_each(&block)
self
end
end