У меня есть класс Angle, который я хочу вести себя как поплавок с дополнительным поведением. Я создал класс, который будет содержать float и прокси для всех неизвестных ему методов:
class Angle
include Math
def initialize(angle=0.0)
@angle = Float(angle)
# Normalize the angle
@angle = @angle.modulo(PI*2)
end
def to_f
@angle.to_f
end
# Other functionality...
def method_missing(message, *args, &block)
if block_given?
@angle.public_send(message, *args, &block)
else
@angle.public_send(message, *args)
end
end
end
Работает нормально. Однако, когда я пытаюсь использовать его с операциями триггера, например, Math.cos, я получаю:
> a = Angle.new(0.0)
=> #<Angle:0x00000000cdb220 @angle=0.0>
@angle=0.0
> Math.cos(a)
TypeError: can't convert Angle into Float
Я знаю, что могу использовать Float (a) для преобразования в float, но это неудобно, так как я хочу, чтобы этот класс вел себя как float. Есть ли способ автоматически конвертировать Angle в float в этих случаях?