2012-05-03 22 views
6

Tengo un código que calcula la enésima raíz 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 simplemente hacerAgregue el mismo método a varias clases

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. 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 la publicación, me di cuenta de que esto podría ser una mejor opción para los programadores.SE, ya que es teórico, así como basado en un solo problema. Siéntase libre de migrar en consecuencia ...

+2

Nota que en el 'retorno' anterior no es necesario (y es no idiomático). – Phrogz

Respuesta

8

La parte pertinente de la jerarquía de clases es así:

Así parchear el cambio en numérico para cubrir todos a la vez:

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

A continuación, puede hacer lo siguiente:

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

Usted querrá utilizar #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 

Ver this blog post como referencia.

Como alternativa, puede crear un módulo de 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 esta última. Está más claro lo que estás haciendo y permite adiciones únicas también.

+0

+1 por ser correcto en general, pero -1 por no tener la respuesta correcta para la necesidad real: heredar de 'Numérico'. – Phrogz

Cuestiones relacionadas