summaryrefslogtreecommitdiff
path: root/numeric.rb
diff options
context:
space:
mode:
Diffstat (limited to 'numeric.rb')
-rw-r--r--numeric.rb29
1 files changed, 29 insertions, 0 deletions
diff --git a/numeric.rb b/numeric.rb
index 4dc406fd23..ebe06a7666 100644
--- a/numeric.rb
+++ b/numeric.rb
@@ -241,6 +241,35 @@ class Integer
self
end
+ # call-seq:
+ # downto(limit) {|i| ... } -> self
+ # downto(limit) -> enumerator
+ #
+ # Calls the given block with each integer value from +self+ down to +limit+;
+ # returns +self+:
+ #
+ # a = []
+ # 10.downto(5) {|i| a << i } # => 10
+ # a # => [10, 9, 8, 7, 6, 5]
+ # a = []
+ # 0.downto(-5) {|i| a << i } # => 0
+ # a # => [0, -1, -2, -3, -4, -5]
+ # 4.downto(5) {|i| fail 'Cannot happen' } # => 4
+ #
+ # With no block given, returns an Enumerator.
+ def downto to
+ Primitive.attr! :inline_block
+ unless defined?(yield)
+ return Primitive.cexpr! 'SIZED_ENUMERATOR(self, 1, &to, int_downto_size)'
+ end
+
+ from = self
+ while from >= to
+ yield from
+ from = from.pred
+ end
+ end
+
# call-seq:
# to_i -> self
#