Namespace collision

Ciao ragazzi,

facendo le mie prime prove in Ruby mi è venuto in mente di scrivere una
versione di detect diversa da quella di Enumerable:

module Extention1

def detect()
res_array = []
if ( self.respond_to?(“each”) )
self.each do
|element|
res = yield(element)
if( res ==true )
res_array.push(element)
end
end
return res_array
else return nil
end

end
end

poi per inclusione in Array:

class Array

    include Extention1

end

array_result = [1,2,3].detect(){…}

a questo punto, come faccio a far convivere le due versioni di detect,
cioè la mia e quella che Array include da Enumerable?

per fare quello che chiedi, ti basta creare un alias per il vecchio
detect prima di sovrascriverlo:

class Array
alias old_detect detect # creo l’alias

 include Extention1 # poi lo sovrascrivo

end

a questo punto se hai bisogno dell’originale, potrai chiamarlo con
old_detect

capisco che stai facendo degli esperimenti didattici, tuttavia tieni
presente che sovrascrivere il metodo di una classe cos importante
potrebbe portare a strani comportamenti difficili da individuare e
correggere. in ogni caso, puoi ottenere lo stesso risultato (evitando i
pericoli descritti) semplicemente creando una classe ad-hoc che si
comporta come un array
ed inserendo/sovrascrivendo i metodi che ti
occorrono :wink:

prova a leggere questo paio di articoli:

ciao,
A.

Il 09/11/2010 17:02, Vogon P. ha scritto:

oppure aggiungendo un metodo che si chiami “new_detect” invece che
sovrascrivere il vecchio