2012-05-03 18 views
6

Ho un codice che calcola l'ennesima radice di un numero. In questo momento, quel metodo funziona solo su Fixnum, perché l'ho definito all'interno della classe Fixnum. Sarebbe molto facile da fare soloAggiungere lo stesso metodo a più classi

class Float 
    #same code as was in Fixnum 
end 

ma che sembra inutile. Non ho idea di come chiamare dinamicamente le classi. Ho provato:

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

ma quello non ha funzionato. Come faccio a fare questo? Nota: Dopo la pubblicazione, ho realizzato che questo potrebbe essere più adatto per Programmers.SE, in quanto è teorico, nonché basato su un singolo problema. Sentitevi liberi di migrare di conseguenza ...

+2

Nota che nel precedente 'return' non è necessario (ed è non idiomatica). – Phrogz

risposta

8

La parte rilevante della gerarchia delle classi si presenta così:

Così patch per il cambiamento in numerico per coprire tutti in una volta:

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

Poi si possono fare queste cose:

>> 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

Ti consigliamo di utilizzare #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 

Vedi this blog post come riferimento.

In alternativa, è possibile creare un modulo e includerlo in ogni classe:

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

class Fixnum 
    include MyRoot 
end 

class Float 
    include MyRoot 
end 

mi chino verso quest'ultimo. È più chiaro cosa stai facendo e consente anche aggiunte una tantum.

+0

+1 per avere ragione in generale, ma -1 per non avere la risposta corretta per l'effettiva necessità: eredita da 'Numerico'. – Phrogz

Problemi correlati