Проблема не в сильных параметрах, а в том, как Ruby анализирует сигнатуры и хэши методов.Немного абстрагирован ваш первый пример:
some_method(arg1, arg2, key1: val1, key2: val2)
Ruby распознает неявный конечный хэш и внутренне представит его следующим образом:
some_method(arg1, arg2, {key1: val1, key2: val2})
This only работает для большинства правых аргументов, подобных хешу.Во втором примере вы сделали это:
some_method(arg1, key1: val1, arg2, key2: val2)
Руби не знает, что с этим делать.Он превращает аргумент key2
в хеш, но затем остается с аргументом, который выглядит как именованный аргумент, и аргументом.И это не нравится.
Вы можете исправить это, выполнив это:
some_method(arg1, {key1: val1}, arg2, key2: val2)
Или даже так:
some_method(arg1, {key1: val1}, arg2, {key2: val2})
Оба из которых увидит Rubyв качестве аргумента хэш, аргумент, хэш и может обрабатывать.