что означает &: в рубине, это блок, смешанный с символом?

Возможный дубликат:
Что означает map (&: name ) означает в Ruby?
Ruby / Ruby on Rails с амперсандом ярлык с двоеточием

Например,

contacts.sort_by(&:first_name).

Я понимаю, что это значит, но я не понимаю нотацию & :, что это значит, это символ (:) с блоком (&)? Где я могу прочитать об этом подробнее?


person Kamilski81    schedule 08.02.2012    source источник
comment
Это дубликат не менее 16 других вопросов, которые уже были заданы и на которые даны ответы здесь, в StackOverflow: Понимание [ClassOne, ClassTwo] .each ( &: my_method), Что означает map(&:name) в Ruby?, Что такое &:capitalize в Ruby?, Ярлык для Ruby / Ruby on Rails с амперсандом и двоеточием, Ruby: &:symbol syntax,…   -  person Jörg W Mittag    schedule 08.02.2012
comment
Извините, хотите верьте, хотите нет, я искал это повсюду и не нашел ответа ... извините!   -  person Kamilski81    schedule 08.02.2012


Ответы (2)


Когда & используется перед объектом Proc при вызове метода, он обрабатывает Proc, как если бы он был обычным блоком после вызова.
Когда & используется перед другим типом объекта (символ :first_name в вашем случае) при вызове метода, он пытается чтобы вызвать to_proc для этого объекта, и если у него нет метода to_proc, вы получите TypeError.

Обычно &:first_name совпадает с &:first_name.to_proc.

Symbol # to_proc Возвращает объект Proc которые отвечают на данный метод с помощью sym.

:first_name.to_proc вернет Proc, который выглядит следующим образом:

proc { |obj, *args, &block| obj.first_name(*args, &block) }

этот Proc вызывает метод, указанный исходным символом на объекте, передаваемом в качестве первого параметра, и передает все остальные параметры + блок в качестве аргументов этого метода.

Еще один пример:

> p = :each.to_proc
=> #<Proc:0x00000001bc28b0>
> p.call([1,2,3]) { |item| puts item+1 }
2
3
4
=> [1, 2, 3]
person Aliaksei Kliuchnikau    schedule 08.02.2012

То же самое и с contacts.sort_by {|o| o.first_name}

Он возвращает объект Proc, который отвечает на данный метод посредством sym.

person xdazz    schedule 08.02.2012
comment
Проголосовали против, чтобы препятствовать ответам на часто повторяющиеся вопросы. - person Phrogz; 08.02.2012
comment
@Phrogz Так что, отвечая на вопрос, я должен сначала искать? - person xdazz; 08.02.2012
comment
На мой взгляд, да. Прости. Этот вопрос следует закрыть и удалить в интересах Stack Overflow. Сложнее удалить вопрос, если на него есть ответы. - person Phrogz; 08.02.2012
comment
@xdazz Хотя этот вопрос все равно может быть закрыт. Я не верю, что люди должны «поискать», прежде чем отвечать на вопрос, что определенно кажется контрпродуктивным. - person Kamilski81; 08.02.2012
comment
@ Kamilski81 Я ценю ваш отзыв. Я пойду исследовать и расскажу больше о мете. - person Phrogz; 08.02.2012
comment
мета-сообщение - person Adam Rackis; 08.02.2012
comment
@ Kamilski81 - Я с вами - если я вижу вопрос, на который могу ответить, я отвечаю на него. У меня есть дела поважнее, чем сначала искать дубликаты. Не говоря уже о том, что к тому времени, когда я закончу поиск, на вопрос уже будет несколько ответов. - person Adam Rackis; 08.02.2012