Обезьяноподобный рубиновый метод с ударом

Возможно ли обезьяна-патч метод с ударом в конце?

Я хочу обезьяну-патч 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' в конце.

Как насчет:

class String
  def upcase!
     #Your logic here
  end
end
Другие вопросы по тегам