Рубиновый блок и не заключенные в скобки аргументы - PullRequest
9 голосов
/ 07 января 2009

Я извлек простой пример:

require 'pp'
x = 1..3
pp x.map do |i| {:value => i, :double => (i*2)} end
pp x.map { |i| {:value => i, :double => (i*2)} }

pp(x.map do |i| {:value => i, :double => (i*2)} end)
pp(x.map { |i| {:value => i, :double => (i*2)} })

Мне интересно, почему первый пп производит:

[1, 2, 3]

Пока все одеры дают:

[{:value=>1, :double=>2}, {:value=>2, :double=>4}, {:value=>3, :double=>6}]

Я предполагаю, что это как-то связано с приоритетом оператора. Где найти хорошее объяснение?

1 Ответ

14 голосов
/ 07 января 2009

Это потому что ты звонишь

pp x.map

и передача блока в pp (который игнорирует его)

Как объяснено в Программировании Ruby Книга

Брекеты имеют высокий приоритет; do имеет низкий приоритет

Таким образом, по сути, фигурные скобки привязываются к ближайшему к ним вызову функции (x.map), тогда как действительно привязываются к самому дальнему (pp). Это немного упрощенно, но это должно объяснить эту ситуацию

...