*
- это оператор splat (или звездочка). В контексте метода он определяет список аргументов переменной длины. В вашем случае все аргументы, переданные func
, будут помещены в массив с именем args
. Вы также можете указать конкретные аргументы перед аргументом переменной длины, например:
def func2(arg1, arg2, *other_args)
# ...
end
Допустим, мы называем этот метод:
func2(1, 2, 3, 4, 5)
Если вы проверяете arg1
, arg2
и other_args
в пределах func2
сейчас, вы получите следующие результаты:
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]
будет содержать хеш, как вы наблюдаете.
Ресурсы:
Обновление на основе комментариев ОП
Если вы хотите передать Hash в качестве аргумента, вы не должны использовать оператор splat. Ruby позволяет вам опустить скобки, , включая те, которые указывают хэш (с предупреждением, продолжайте чтение), в вызовах методов. Поэтому:
my_func arg1, arg2, :html_arg => value, :html_arg2 => value2
эквивалентно
my_func(arg1, arg2, {:html_arg => value, :html_arg2 => value2})
Когда Ruby видит оператор =>
в вашем списке аргументов, он знает, что должен принимать аргумент в качестве хэша, даже без явной записи {...}
(обратите внимание, что это применимо, только если аргумент хеша является последним!) .
Если вы хотите собрать этот хеш, вам не нужно делать ничего особенного (хотя вы, вероятно, захотите указать пустой хеш в качестве значения по умолчанию в определении вашего метода):
def my_func(arg1, arg2, html_args = {})
# ...
end