Обезьяноподобный рубиновый метод с ударом
Возможно ли обезьяна-патч метод с ударом в конце?
Я хочу обезьяну-патч String.upcase!
, но я не знаю, как этого добиться.
Проблема в том, что я хочу изменить исходный строковый объект.
Вот пример:
class String
def upcase!
self.mb_chars.upcase.to_s
end
end
Теперь, если я наберу это в консоли и попробую, это не сработает:
[1] pry(main)> asd="asd"
=> "asd"
[2] pry(main)> asd.upcase
=> "ASD"
[3] pry(main)> asd
=> "asd"
[4] pry(main)> asd.upcase!
=> "ASD"
[5] pry(main)> asd
=> "asd"
4 ответа
Ваша проблема не зависит от метода взрыва. Если вы хотите заменить строку получателя, используйте метод String#replace
,
class String
def foo
replace(whatever_string_you_want_to_replace_the_receiver_with)
end
end
Вы можете, возможно, поставить mb_chars.upcase
в качестве аргумента replace
,
Вы должны избегать мартышки, исправляющей класс верхнего уровня, такой как String
, Если вы хотите знать почему, я настоятельно рекомендую вам прочитать " Обезьянья патч - Разрушение рубина" Авди Гримма.
Теперь, чтобы ответить на ваш вопрос, вы можете сделать что-то вроде этого:
class String
def upcase!
replace(upcase) # self is not mandatory here
end
end
> s = "foo"
=> "foo"
> s.upcase
=> "FOO"
> s
=> "foo"
> s.upcase!
=> "FOO"
> s
=> "FOO"
Взрыв - это только часть имени метода. Это не имеет абсолютно никакого особого значения вообще. Вы пишете метод с ударом в конце точно так же, как вы пишете метод с 'o' или 'z' в конце.