*
преобразует элементы массива в список аргументов, поэтому:
call(*[{a: 1}, {b: 3}])
эквивалентно:
call({a: 1}, {b: 3})
Ruby также неявно преобразует хэши в аргументы ключевых слов (без **
), поэтому приведенное выше эквивалентно: †
call({a: 1}, b: 3)
Следовательно, {a: 1}
рассматривается как позиционный аргумент и b: 3
(или {b: 3}
) в качестве аргумента ключевого слова .И поскольку call
не принимает аргумент ключевого слова с именем b
, вы получаете ArgumentError: unknown keyword: b
.
Чтобы избежать этого, вы можете передать дополнительный пустой хеш ‡ в качестве последнего аргумента:
call({a:1}, {b:2}, {})
или:
call(*[{a:1}, {b:2}], {})
или
scores = [{a:1}, {b:2}]
call(*scores, {})
† Есть запрос чтобы добавить «настоящие» аргументы ключевых слов в Ruby 3.
‡ IMO, было бы правильнее использовать call(*scores, **{})
для обозначения «без аргументов ключевого слова», но из-за ошибка это в настоящее время не работает.Однако вы можете использовать call(*scores, **Hash.new)