mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
de5da4b7f6
Before:
a=[]; 7.step(4, -3.0) { |c| a << c }; p a #=> [7, 4.0]
After / Ruby:
a=[]; 7.step(4, -3.0) { |c| a << c }; p a #=> [7.0, 4.0]
171 lines
2.5 KiB
Ruby
171 lines
2.5 KiB
Ruby
##
|
|
# Numeric
|
|
#
|
|
# ISO 15.2.7
|
|
class Numeric
|
|
include Comparable
|
|
##
|
|
# Returns the receiver simply.
|
|
#
|
|
# ISO 15.2.7.4.1
|
|
def +@
|
|
self
|
|
end
|
|
|
|
##
|
|
# Returns the receiver's value, negated.
|
|
#
|
|
# ISO 15.2.7.4.2
|
|
def -@
|
|
0 - self
|
|
end
|
|
|
|
##
|
|
# Returns the absolute value of the receiver.
|
|
#
|
|
# ISO 15.2.7.4.3
|
|
def abs
|
|
if self < 0
|
|
-self
|
|
else
|
|
self
|
|
end
|
|
end
|
|
end
|
|
|
|
##
|
|
# Integral
|
|
#
|
|
# mruby special - module to share methods between Floats and Integers
|
|
# to make them compatible
|
|
module Integral
|
|
##
|
|
# Calls the given block once for each Integer
|
|
# from +self+ downto +num+.
|
|
#
|
|
# ISO 15.2.8.3.15
|
|
def downto(num, &block)
|
|
return to_enum(:downto, num) unless block
|
|
|
|
i = self.to_i
|
|
while i >= num
|
|
block.call(i)
|
|
i -= 1
|
|
end
|
|
self
|
|
end
|
|
|
|
##
|
|
# Returns self + 1
|
|
#
|
|
# ISO 15.2.8.3.19
|
|
def next
|
|
self + 1
|
|
end
|
|
# ISO 15.2.8.3.21
|
|
alias succ next
|
|
|
|
##
|
|
# Calls the given block +self+ times.
|
|
#
|
|
# ISO 15.2.8.3.22
|
|
def times &block
|
|
return to_enum :times unless block
|
|
|
|
i = 0
|
|
while i < self
|
|
block.call i
|
|
i += 1
|
|
end
|
|
self
|
|
end
|
|
|
|
##
|
|
# Calls the given block once for each Integer
|
|
# from +self+ upto +num+.
|
|
#
|
|
# ISO 15.2.8.3.27
|
|
def upto(num, &block)
|
|
return to_enum(:upto, num) unless block
|
|
|
|
i = self.to_i
|
|
while i <= num
|
|
block.call(i)
|
|
i += 1
|
|
end
|
|
self
|
|
end
|
|
|
|
##
|
|
# Calls the given block from +self+ to +num+
|
|
# incremented by +step+ (default 1).
|
|
#
|
|
def step(num=nil, step=1, &block)
|
|
raise ArgumentError, "step can't be 0" if step == 0
|
|
return to_enum(:step, num, step) unless block
|
|
|
|
i = self
|
|
if Object.const_defined?(:Float) &&
|
|
(kind_of?(Float) || num.kind_of?(Float) || step.kind_of?(Float))
|
|
i = i.to_f
|
|
num = num.to_f unless num == nil
|
|
step = step.to_f
|
|
end
|
|
|
|
if num == nil
|
|
while true
|
|
block.call(i)
|
|
i += step
|
|
end
|
|
return self
|
|
end
|
|
if step > 0
|
|
while i <= num
|
|
block.call(i)
|
|
i += step
|
|
end
|
|
else
|
|
while i >= num
|
|
block.call(i)
|
|
i += step
|
|
end
|
|
end
|
|
self
|
|
end
|
|
end
|
|
|
|
##
|
|
# Integer
|
|
#
|
|
# ISO 15.2.8
|
|
class Integer
|
|
include Integral
|
|
##
|
|
# Returns the receiver simply.
|
|
#
|
|
# ISO 15.2.8.3.14
|
|
def ceil
|
|
self
|
|
end
|
|
|
|
##
|
|
# Returns the receiver simply.
|
|
#
|
|
# ISO 15.2.8.3.17
|
|
def floor
|
|
self
|
|
end
|
|
|
|
##
|
|
# Returns the receiver simply.
|
|
#
|
|
# ISO 15.2.8.3.24
|
|
alias round floor
|
|
|
|
##
|
|
# Returns the receiver simply.
|
|
#
|
|
# ISO 15.2.8.3.26
|
|
alias truncate floor
|
|
end
|