Ruby Language
Обезьяна патч в рубине
Поиск…
замечания
Патч обезьяны, хотя и удобен, имеет некоторые подводные камни, которые не сразу очевидны. В частности, патч, подобный этому примеру, загрязняет глобальную область. Если два модуля добавляют Hash#symbolize
, то только последний модуль должен применить его изменение; остальные стираются.
Кроме того, если есть ошибка в исправленном методе, stacktrace просто указывает на исправленный класс. Это означает, что есть ошибка в самом классе Hash
(который есть сейчас).
И, наконец, поскольку Ruby очень гибкий в отношении того, какие контейнеры держать, метод, который кажется очень простым, когда вы пишете его, имеет множество неопределенных функций. Например, создание Array#sum
полезно для массива чисел, но ломается при задании массива пользовательского класса.
Более безопасная альтернатива - это уточнения, доступные в Ruby> = 2.0.
Добавление функциональности
Вы можете добавить метод в любой класс в Ruby, независимо от того, является ли он встроенным или нет. Вызывающий объект ссылается на 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'