В Ruby, почему «омега-3 (dHA)».gsub(/b([a-z])/, ».upcase) не работает?

#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 метод.