Помощь с интересным синтаксисом в коде Ruby, который я нашел - PullRequest
1 голос
/ 25 января 2010

Я сейчас читаю Agile Web Development с Rails, 3-е издание. На странице 672 я наткнулся на этот метод:

def capitalize_words(string)
  string.gsub(/\b\w/) { $&.upcase }
end

Что делает код в блоке? Я никогда не видел этот синтаксис. Это похоже на синтаксис array.map(&:some_method)?

Ответы [ 3 ]

4 голосов
/ 25 января 2010

Это титульный корпус ввода. внутри блока $ & - это встроенный элемент, представляющий текущее совпадение (\ b \ w, т.е. первую букву каждого слова), которое затем пишется в верхнем регистре.

2 голосов
/ 25 января 2010

Вы затронули одну из немногих вещей, которые мне не нравятся в Ruby :)

Волшебная переменная $ & содержит сопоставленную строку из предыдущего успешного сопоставления с образцом. Так что в этом случае это будет первый символ каждого слова.

Это упоминается в RDoc для String.gsub:

http://ruby -doc.org / ядро ​​/ классов / String.html # M000817

2 голосов
/ 25 января 2010

gsub заменяет все, что совпало в регулярном выражении с результатом блока. так что да, в этом случае вы сопоставляете первую букву слов, а затем заменяете ее версией в верхнем регистре.

относительно немного странного синтаксиса внутри блока, это эквивалентно (и, возможно, легче понять):

def capitalize_words(string)
  string.gsub(/\b\w/) {|x| x.upcase}
end

или даже пижон:

def capitalize_words(string)
  string.gsub /\b\w/, &:upcase
end

в отношении регулярного выражения (любезно предоставлено книгой кирки), \b соответствует границе слова и \w любой «символ слова» (алфавитно-цифровые и подчеркивания). поэтому \b\w соответствует первому символу слова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...