2013-12-09 2 views
3

Например, я хочу взять строку и добавить 1 значение для каждого символа a-z. Я ищу что-то с похожим синтаксисом:Ruby Regexp с помощью gsub есть эквивалент ключевого слова self?

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" 

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

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

ответ

14

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

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

Сокращенный вариант с использованием &:next синтаксис:

str.gsub(/[a-z]/, &:next) 
# => "bcd123" 
+0

Ответ будет принят как можно скорее. Спасибо за понимание. Я не могу поверить, насколько простым и изящным рубином может быть. Я склоняюсь к усложнению вещей. – Singularity

Смежные вопросы