Передача хэша функции (*args) и его значение
при использовании идиомы, такие как:
def func(*args)
# some code
end
что означает *args
? Гуглить этот конкретный вопрос было довольно сложно, и я ничего не мог найти.
кажется, все аргументы на самом деле появляются в args[0]
поэтому я пишу защитный код, такой как:
my_var = args[0].delete(:var_name) if args[0]
но я уверен, что есть лучший способ, который я упускаю.
1 ответ:
The
*
- это splat оператор (или звездочку). В контексте метода, он задает список аргументов переменной длины. В вашем случае все аргументы передаются вfunc
будет помещать в массив под названиемargs
. Вы также можете указать конкретные аргументы перед аргументом переменной длины, например:def func2(arg1, arg2, *other_args) # ... end
допустим, мы называем этот метод:
func2(1, 2, 3, 4, 5)
при проверке
arg1
,arg2
иother_args
внутри , вы получим следующие результаты:def func2(arg1, arg2, *other_args) p arg1.inspect # => 1 p arg2.inspect # => 2 p other_args.inspect # => [3, 4, 5] end
в вашем случае, вы, кажется, передаете хэш в качестве аргумента для вашего
func
в этом случаеargs[0]
будет содержать хэш, как вы наблюдаете.ресурсы:
обновление на основе OP комментарии
если вы хотите передать Хэш в качестве аргумента, вы не должны использовать оператор восклицательный знак. Ruby позволяет опустить скобки,, включая те, которые определяют хэш - (С оговоркой, продолжайте читать), в ваших вызовах метода. Таким образом:
my_func arg1, arg2, :html_arg => value, :html_arg2 => value2
эквивалентно
my_func(arg1, arg2, {:html_arg => value, :html_arg2 => value2})
когда Руби видит
=>
оператор в вашем списке аргументов, он знает, чтобы принять аргумент в качестве хэша, даже без явного{...}
нотация (обратите внимание, что это применимо только в том случае, если хэш-аргумент является последним!).если вы хотите собрать этот хэш, вам не нужно делать ничего особенного (хотя вы, вероятно, захотите указать пустой хэш в качестве значения по умолчанию в определении метода):
def my_func(arg1, arg2, html_args = {}) # ... end