1.8.7 жалуется не на получение блоком двух параметров, а на вашу попытку предоставить значение по умолчанию для второго параметра. Этот:
users.collect { |item, value| value << {:name => item} }.flatten
отлично анализируется в 1.8.7, но, конечно, во время выполнения он падает, потому что value
это nil
.
1.9 допускает значения по умолчанию для аргументов блоков (см. ниже).
Так что нет, в документации нет ошибок, вы просто используете collect
< /a> странным образом, который работает в 1.9.2, потому что он допускает значения по умолчанию для аргументов блока.
В любом случае, ваше использование collect
немного запутано и может делать не совсем то, что вы думаете, вы должны послушать Каспера и просто сделать простой collect
:
users.collect { |item| { :name => item } }
Но если у вас есть что-то для <<
и вы хотите использовать его несмотря ни на что, вы можете использовать inject
как в 1.8.7, так и в 1.9.2:
users.inject([ ]) { |value, item| value << { :name => item } }
Хотя это бессмысленная сложность.
Вы возбудили мое любопытство, поэтому я обратился к файлам синтаксического анализатора Ruby за авторитетной ссылкой. Возможно, бессмысленная занятая работа, но «бессмысленная» и «плохая» — разные вещи.
В 1.9.2-p180 parse.y
есть следующие вещи:
block_param : f_arg ',' f_block_optarg ',' f_rest_arg opt_f_block_arg
| f_arg ',' f_block_optarg ',' f_rest_arg ',' f_arg opt_f_block_arg
| f_arg ',' f_block_optarg opt_f_block_arg
/* ... */
f_block_optarg : f_block_opt
f_block_opt : tIDENTIFIER '=' primary_value
Если вы немного проследите это, вы увидите, что правило block_param
используется для таких вещей:
{ |eggs| ... }
{ |two_cent, stamp| ... }
{ |where_is, pancakes = 'house'| ... }
а также форма do
/end
. Затем проследите от block_param
до f_block_opt
, и вы увидите, где значения по умолчанию явно разрешены грамматикой.
OTOH, В 1.8.7-p248 parse.y
есть вот это:
opt_block_var : none
| '|' /* none */ '|'
| tOROP
| '|' block_var '|'
В block_var
нет ничего, что допускало бы значения по умолчанию для аргументов блока. tOROP
предназначен только для того, чтобы разрешить обе эти формы:
{ | | pancakes } # '|' /* none */ '|'
{ || pancakes } # tOROP, the logical "or" operator: ||
person
mu is too short
schedule
04.08.2011