2012-03-16 9 views
7

Questo mi getta una SystemStackError a 1.9.2 Rubino ( ma lavora in Rubinius ):Come posso ridefinire il metodo + (più) di Fixnum in Ruby e mantenere la funzionalità originale +?

class Fixnum 
    def +(other) 
    self + other * 2 
    end 
end 

ma non c'è super per + (sulla base di altri errori).

Come accedere alla funzionalità + originale?

+0

Aspetta, stai dicendo che funziona come ti aspetti in Rubinius? –

+0

L'ho appena testato, non funziona in Rubinius. Il metodo sottoposto a override viene semplicemente ignorato. –

+2

Sei sicuro di voler fare questo? È una pistola a pedale completamente automatica carica proprio lì. –

risposta

13

Utilizzare alias_method. Alias ​​Fixnum s' + a qualcos'altro, quindi fare riferimento ad esso nel nuovo +:

class Fixnum 
    alias_method :old_add, :+ 
    def +(other) 
    self.old_add(other) * 2 
    end 
end 
+1

Inoltre, questo sembra davvero confondere il mio IRB in qualche modo, ma in effetti funziona in semplice Ruby. –

+0

@NiklasB. Di solito provo ad astenermi dal modificare le risposte entro i primi minuti. E le persone sembrano confondere la sintassi per 'alias' vs.' alias_method' molto. –

+3

@Andrew: Non sono sorpreso di sentire che * l'aggiunta ininterrotta di * overriding * non va giù troppo bene per l'IRb ... Questo è un brutto attacco che posso a malapena descrivere attraverso le parole. –

1

Un altro approccio interessante potrebbe essere quella di passare un blocco per il metodo di Fixnum module_eval. Così, ad esempio:

module FixnumExtend 
    puts '..loading FixnumExtend module' 

    Fixnum.module_eval do |m| 
    alias_method :plus,  :+ 
    alias_method :min,  :- 
    alias_method :div,  :/ 
    alias_method :mult,  :* 
    alias_method :modu,  :% 
    alias_method :pow,  :** 

    def sqrt 
    Math.sqrt(self) 
    end 

    end 

end 

Ora, dopo aver incluso FixnumExtend in tutta la mia app che posso fare:

2.plus 2 
=> 4 

81.sqrt 
=> 9 

Sto usando questo metodo per aiutare il mio motore OCR riconosce il codice scritto a mano. È più facile con 2.div 2 rispetto a 2/2.

Problemi correlati