Передача хэша функции (*args) и его значение


при использовании идиомы, такие как:

def func(*args)
  # some code
end

что означает *args? Гуглить этот конкретный вопрос было довольно сложно, и я ничего не мог найти.

кажется, все аргументы на самом деле появляются в args[0] поэтому я пишу защитный код, такой как:

my_var = args[0].delete(:var_name) if args[0]

но я уверен, что есть лучший способ, который я упускаю.

1 65

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