2009-11-24 2 views
5

Я только что прочитал этот ответ Converting upper-case string into title-case using Ruby.Что такое `&: capitalize` в Ruby?

Существует следующая строка кода

"abc".split(/(\W)/).map(&:capitalize).join 

Что именно &:capitalize? Прежде, чем я сам вложил это в irb, я бы сказал, это неправдоподобный синтаксис Ruby. Это должен быть какой-то объект Proc, потому чтоnormaly берет блок. Но это не так. Если я помещу его в одиночку, я получаю syntax error, unexpected tAMPER.

+0

Причина, по которой это не работает в irb для вас, вероятно, потому что, как говорит sepp2k, она была запечена только в стандартной библиотеке Ruby 1.8.7, и я предполагаю, что вы используете более раннюю версию. Вы видите это довольно часто, хотя, поскольку ActiveSupport также бросает его, а ActiveSupport поставляется с Rails. Если вы попробуете его в скрипте/консоли Rails, вы, вероятно, обнаружите, что он работает. –

+0

Возможный дубликат [Что означает карта (&: name) в Ruby?] (Http://stackoverflow.com/questions/1217088/what-does-mapname-mean-in-ruby) –

ответ

6

foo(&a_proc_object) превращает a_proc_object в блок и вызывает foo с этим блоком.

foo(&not_a_proc_object) вызывает to_proc по адресу not_a_proc_object, а затем превращает объект proc, возвращенный to_proc, в блок и вызывает foo с этим блоком.

В рубине 1.8.7+ и активной поддержке Symbol#to_proc определяется для возврата proc, который вызывает метод, названный символом в аргументе proc.

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