basics/integers/coercion_parens.rb

tests/_examples/basics/integers/coercion_parens.rb in the metorex repository.

# An operand a number does not know is asked to `coerce`, which answers the
# pair the operator is applied to instead.
class Scaled
  def initialize(value)
    @value = value
  end

  def coerce(other)
    [other, @value]
  end
end

three = Scaled.new(3)
p(6 & three)
p(6 | three)
p(6 ^ three)
p(6 * three)
p(6 - three)
p(6 > three)
p(6 <=> three)

# An error raised inside `coerce` belongs to the caller.
class Refuses
  def coerce(other)
    raise(ArgumentError, "will not coerce")
  end
end

begin
  1 + Refuses.new
rescue ArgumentError => error
  puts(error.message)
end

# A number past the Float range compares exactly, rather than by rounding to
# a Float first.
huge = (2 ** 64) + 38
p(huge <= (huge + 0.0))
p(huge > (huge + 0.0))
p(huge.gcd(24))
p(huge.lcm(1) == huge)

Output:

2
7
5
18
3
true
1
will not coerce
false
true
6
true