Ruby Language
Apaplackning i Ruby
Sök…
Anmärkningar
Monkey patchning, även om det är praktiskt, har några fallgropar som inte är omedelbart uppenbara. Framför allt förorenar en sådan lapp i exemplet den globala räckvidden. Om två moduler båda lägger till Hash#symbolize
, tillämpar bara den senaste modulen som krävs faktiskt dess ändring; resten raderas.
Dessutom, om det finns ett fel i en korrigerad metod, pekar stacktrace helt enkelt till den korrigerade klassen. Detta innebär att det finns ett fel i Hash
klassen själv (som det finns nu).
Slutligen, eftersom Ruby är väldigt flexibel med vilka behållare som ska hållas, en metod som verkar mycket enkel när du skriver den har massor av odefinierad funktionalitet. Att skapa Array#sum
är till exempel bra för en mängd siffror, men bryts när du får en matris av en anpassad klass.
Ett säkrare alternativ är förfiningar, tillgängliga i Ruby> = 2.0.
Lägga till funktionalitet
Du kan lägga till en metod till valfri klass i Ruby, oavsett om det är en inbyggd eller inte. Det anropande objektet refereras med mig 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'