Agregar el mismo método a múltiples clases

Tengo un código que calcula la raíz enésima de un número. En este momento, ese método solo funciona en Fixnum, porque lo definí dentro de la clase Fixnum. Sería muy fácil de hacer

class Float
    #same code as was in Fixnum
end

pero eso parece innecesario. No tengo idea de cómo llamar dinámicamente a las clases. Lo intenté:

classes = [Fixnum, Float]
classes.each do |x|
    x.instance_eval do
        def root(pow)
            return self ** (1/pow.to_f)
        end
    end
end

Pero eso no funcionó. ¿Cómo hago esto? Nota:: Después de publicar, me di cuenta de que esto podría ser más adecuado para Programmers.SE, ya que es teórico y se basa en un solo problema. Siéntase libre de migrar en consecuencia...

preguntado el 03 de mayo de 12 a las 21:05

Tenga en cuenta que en lo anterior return no es necesario (y no es idiomático). -

2 Respuestas

La parte relevante de la jerarquía de clases se ve así:

Así que cambie su cambio a Numérico para cubrirlos todos a la vez:

class Numeric
  def root(pow)
    return self ** (1/pow.to_f)
  end
end

Entonces puedes hacer estas cosas:

>> 11.root(2) # Integer
=> 3.3166247903554
>> 2.18.root(3) # Float
=> 1.296638256974172
>> Rational(23, 42).root(6) # Rational
=> 0.9045094132598528
>> 2**1000.root(42) # Integer
=> 2.2638347236157763

respondido 10 mar '19, 17:03

Querrás usar #class_eval:

classes = [Fixnum, Float]
classes.each do |x|
    x.class_eval do
        def root(pow)
            return self ** (1/pow.to_f)
        end
    end
end

Vea esta entrada del blog como una referencia.

Alternativamente, puede crear un módulo e incluirlo en cada clase:

module MyRoot
  def root(pow)
    return self ** (1/pow.to_f)
  end
end

class Fixnum
  include MyRoot
end

class Float
  include MyRoot
end

Me inclino por lo segundo. Es más claro lo que está haciendo y también permite adiciones únicas.

contestado el 03 de mayo de 12 a las 21:05

+1 por tener razón en general, pero -1 por no tener la respuesta correcta para la necesidad real: heredar de Numeric. - Phrogz

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.