В Ruby, как вы можете передать более одного хеша методу без скобок? - PullRequest
0 голосов
/ 09 июля 2019

В Ruby, как можно передать более одного хэша в метод без скобок?

Например

def abc x,y
end

abc {4,5},{6,4} <- <code>syntax error, unexpected ',', expecting '}'

1 Ответ

2 голосов
/ 09 июля 2019

Му указывает, что вы можете передавать несколько хешей без скобок, если вы передаете их как не-литералы, т.е. как переменные.

Но кроме этого, так что для буквальных хешей,

Вы делаете (нужны скобки для передачи нескольких литеральных хешей), если только вы не передаете аргументы ключевого слова. Вы можете передавать несколько аргументов ключевого слова без скобок.

аргумент ключевого слова будет, когда параметры метода включают двоеточие, например, например. def blah x:, y: тогда вы можете позвонить с blah y:2,x:3. Иногда вам нужно посмотреть на параметр (ы), чтобы увидеть, является ли аргумент ключевым аргументом, например если у вас есть метод, вызываемый с помощью abc x: 3 тогда это может быть def abc x:, и в этом случае вы вызываете его с аргументом ключевого слова. Или это может быть def abc x, в этом случае вы вызываете его с помощью хэша, пропуская {}.

Когда я говорю «ключевое слово аргумент», я не имею в виду хэш… и наоборот, когда я говорю «хэш», я имею в виду не аргумент ключевого слова.

Когда вызов без скобок, вы можете передать только один хеш, и этот хэш должен быть последним аргументом. И вы можете пропустить {} вокруг него.

примечание. Я не эксперт, но что касается смежного вопроса о том, является ли аргумент ключевого слова типом хэша, насколько я понимаю, на момент написания статьи pre ruby ​​3 они есть, но есть предложение для в ruby ​​3 есть «реальные» аргументы ключевых слов, отличные от хэшей https://bugs.ruby -lang.org / Issues / 14183

аргумент ключевого слова не может быть многозначным.

также, хеш может быть автоматически преобразован в аргумент ключевого слова. (Например, если метод определен с параметром, который является аргументом ключевого слова, вы можете передать хеш, например, {x:"a"}, где x является символом, и этот хеш будет преобразован в аргумент ключевого слова x:"a" (этот x является имя параметра).

Я добавлю пункт, касающийся блоков и скобок, потому что блок с {} выглядит немного как хеш, хотя и не является хешем. И блок может иметь некоторое влияние на необходимость скобок.

Если вы видите abc {}, то {} является блоком, а не хешем, и блоки не считаются аргументом. Следовательно, этот вызов работает для def abc, но не для def abc x, где можно получить ошибку, связанную с количеством переданных аргументов.

даже при передаче блока после некоторых других аргументов перед блоком не должно быть запятой, а если блок, завершенный с {}, следует за некоторыми аргументами, вам нужны круглые скобки, но если блок с do .. end следует за некоторыми аргументами вам не нужны скобки

предлагается использовать круглые скобки, если у одного несколько аргументов, если только это не DSL (предметно-ориентированный язык). Вы оставляете скобки в Ruby или нет?

...