Проблема не в строке определения метода, которую вы опубликовали, проблема заключается в использовании переменной for
внутри тела метода. Поскольку for
является зарезервированным словом, вы не можете использовать его как простое имя переменной, но вы можете использовать его как часть хэша. В вашем случае это означает, что вы должны прибегать к использованию произвольных аргументов ключевого слова (**opts
), но вы можете использовать ключевое слово_argument for:
в вызове метода. Возможно, вы захотите поднять ArgumentError
, если ключ отсутствует для подражания поведению подписи метода, который вы указали выше.
def register(something, on:, **opts)
raise ArgumentError, 'missing keyword: for' unless opts.has_key?(:for)
for_value = opts[:for]
puts "registering #{something} on #{on} for #{for_value}"
end
register 'chocolate chips', on: 'cookie'
# ArgumentError: missing keyword: for
register 'chocolate chips', on: 'cookie', for: 'cookie monster'
# registering chocolate chips on cookie for cookie monster
Это один из способов :) Я надеялся не отклоняться от формата с именованным параметром, хотя –
Я знаю его не очень красиво, но он получает работу и синтаксис вызова так же чист –