Самый краткий / элегантный / подходящий метод разбора аргументов в Ruby - PullRequest
2 голосов
/ 10 марта 2012

Думаю, на этот вопрос уже будет ответ, но не смог его найти. Я выполнял синтаксический анализ параметров метода определенным образом и хотел проверить и убедиться, что это наиболее элегантный / лаконичный способ из возможных.

Это то, что я обычно делаю:

def some_method *args
  options = args.extract_options!
  options.assert_valid_keys(:key1, :key2)
  defaults = {:key1 => "one", :key2 => "two"}
  options = defaults.merge(options)

  general_arguments = args[0]

Это, очевидно, предназначено для того, чтобы у меня были вызовы методов вроде:

some_method @user.id, :key1 => "good"

Это работает, но кажется немного длинным для Руби, и, поскольку это своего рода мой "общий паттерн", мне интересно, действительно ли я должен так поступать. Есть ли лучший, более лаконичный или более «рубеский» способ анализа общих параметров?

Предположения

  • Агрессивная защита - я предполагаю, что методы в публичном API предлагаются через плагин gem или gemmable
  • Значения по умолчанию желательны в основном для просмотра шаблонов, которые используют другие
  • Потенциально принято более одного безымянного параметра перед хэшированием

1 Ответ

1 голос
/ 11 марта 2012

Я думаю, это действительно зависит от того, кто или что будет вызывать этот метод. Если это частный метод, то это определенно излишне, поскольку все вызовы к нему будут инкапсулированы. С другой стороны, если это часть общедоступного API в каком-то опубликованном вами геме, то я думаю, что этот защитный подход уместен.

Если ваш вариант использования находится где-то посередине, вы можете выбрать подход, который немного менее оборонителен, но слегка откровенен. Ниже приведен шаблон, которому я склонен следовать, когда метод общедоступен, но имеет только ограниченное количество вызывающих. Требуется фиксированное количество «общих аргументов» и небольшое количество опций, которые имеют значения по умолчанию.

def my_method(id, options={})
  # Set default options
  options[:my_option] ||= "default option"

  # rest of your method goes here
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...