Передача хеша функции (* args) и ее значения - PullRequest
69 голосов
/ 13 сентября 2010

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

def func(*args)
  # some code
end

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

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

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

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

1 Ответ

99 голосов
/ 13 сентября 2010

* - это оператор 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...