#ruby #regex
#рубин #регулярное выражение
Вопрос:
Я хочу писать с заглавной буквы первый символ каждого слова и оставить остальное нетронутым (таким образом, это отличается от Rails titleize
, которые уменьшают остальные). Первая строка является тестовой, а третья строка работает, но мне интересно, почему вторая строка не работает?
ruby-1.9.2-p180 :026 > "omega-3 (dHA)".gsub(/b([a-z])/, '##')
=> "#o#mega-3 (#d#HA)"
ruby-1.9.2-p180 :027 > "omega-3 (dHA)".gsub(/b([a-z])/, ''.upcase)
=> "omega-3 (dHA)"
ruby-1.9.2-p180 :028 > "omega-3 (dHA)".gsub(/b([a-z])/) {|s| s.upcase}
=> "Omega-3 (DHA)"
Ответ №1:
''.upcase
вызывает upcase
метод строки ''
— скобки для вызова необязательны в Ruby. Что, конечно, ничего не делает, поэтому вторая строка просто .gsub(/.../, '')
Комментарии:
1. Чтобы немного расширить, вторым аргументом метода gsub является выражение
''.upcase
. Это вычисляется, и результат этого затем передается в gsub. Тогда как в вашем третьем случае соответствие gsub передается в блок, а затем для соответствия вызывается.upcase
метод.