Ruby Regexp, использующий gsub, есть ли эквивалент ключевого слова self?

Например, я хочу взять строку и добавить 1 значение к каждому символу az. Я ищу что-то с похожим синтаксисом:

str = 'abc123'
str.gsub(/[a-z]/, self.next!)

Вывод: bcd123 Я знаю, что мог бы использовать такой код, как:

irb(main):075:0> 'abc123'.split('').map{|x| if x =~ /[a-z]/ then x.next! else x = x end }.join
=> "bcd123"

Тем не менее, это выглядит довольно небрежно и не очень эффективно. Я бы подумал, что есть гораздо более аккуратный способ совершить тот же подвиг.

Заранее спасибо.

1 ответ

Решение

String#gsub принимает необязательный блок. Возвращаемое значение блока используется в качестве строки замены.

str.gsub(/[a-z]/) { |x| x.next }
# => "bcd123"

Укороченная версия с использованием &:next синтаксис:

str.gsub(/[a-z]/, &:next)
# => "bcd123"
Другие вопросы по тегам