Ruby Language
Monkey Patching in Ruby
Ricerca…
Osservazioni
Le patch per le scimmie, sebbene convenienti, presentano alcune insidie che non sono immediatamente evidenti. In particolare, una patch come quella nell'esempio inquina l'ambito globale. Se due moduli aggiungono entrambi il Hash#symbolize
, solo l'ultimo modulo richiesto applica effettivamente la sua modifica; il resto viene cancellato.
Inoltre, se c'è un errore in un metodo patchato, lo stacktrace punta semplicemente alla classe patchata. Ciò implica che c'è un bug nella classe Hash
stessa (che esiste ora).
Infine, poiché Ruby è molto flessibile con i contenitori da tenere, un metodo che sembra molto semplice quando lo scrivi ha molte funzionalità indefinite. Ad esempio, la creazione della Array#sum
è utile per una matrice di numeri, ma si interrompe quando viene fornita una matrice di una classe personalizzata.
Un'alternativa più sicura è la raffinatezza, disponibile in Ruby> = 2.0.
Aggiunta di funzionalità
Puoi aggiungere un metodo a qualsiasi classe in Ruby, indipendentemente dal fatto che sia un built-in o meno. L'oggetto chiamante viene referenziato usando self
.
class Fixnum
def plus_one
self + 1
end
def plus(num)
self + num
end
def concat_one
self.to_s + '1'
end
end
1.plus_one # => 2
3.plus(5) # => 8
6.concat_one # => '61'