Обработка хеша как аргумента функции - PullRequest
10 голосов
/ 16 марта 2011

Я использую Ruby on Rails 3 и пытаюсь обработать хеш в качестве аргумента функции.

Например, если я сформулирую функцию следующим образом:

def function_name(options = {})
  ...
end

Я хотел бы перейти к function_name хешу, подобному

{"key1"=>"value_1", "key2"=>"value2", "..." => "..."}

, а затем используйте это внутри функции.

Каков лучший \ общий (Rails) способ сделать это?

П.С .: Я где-то видел метод extract_option!, но я не знаю, где найти какую-то документацию и нужно ли мне это для достижения поставленной цели.

Ответы [ 3 ]

15 голосов
/ 16 марта 2011

Просто используйте предоставленное вами определение:

def function_name(options = {})
  puts options["key1"]
end

Назовите его с помощью:

function_name "key1" => "value1", "key2" => "value2"

или

function_name({"key1" => "value1", "key2" => "value2"})

Array # extract_options! просто используется с методами, которые имеют переменные аргументы методов, например:

def function_name(*args)
  puts args.inspect
  options = args.extract_options!
  puts options["key1"]
  puts args.inspect
end

function_name "example", "second argument", "key1" => "value"
# prints
["example", "second argument", { "key1" => "value" }]
value
["example", "second argument"]

Другой полезный метод - Hash # symbolize_keys! , который позволяет вам не заботиться о том, передаете ли вы строки илисимволы для вашей функции, чтобы вы всегда могли получить доступ к таким вещам options[:key1].

3 голосов
/ 16 марта 2011

То, как вы объявили это в вашем примере, будет работать нормально.

def function(options = {})
    item = options[:item]
    need_milk = options[:milk] || false
    cow = options[:bovine]
end

function(:item => "Something")

В приведенном выше случае item == "Something", need_milk == false и cow == nil.

extract_options - это просто дополнение к классу Array и Hash через Rails.

def function(something, else, *args)
   options = args.extract_options! # returns Hash
end

Это полезно, если вы планируете иметь много различных типов параметров в args, но если вам нужны только параметры Hash, ваш оригинальный способ в порядке. Суть кода в Rails для extract_options! Я лично использую его в своем коде на работе, просто записывая его во внешний файл и требуя его в моем проекте.

0 голосов
/ 16 марта 2011

Ruby делает это легко, и вы уже все делали правильно.

Вот пример поэтического режима (минимальный, в стиле DSL):

 def f x = {}
   p x
 end

 f :a => :b
 {:a=>:b}

 f
 {}

 f :a => :b, :c => :d
 {:a=>:b, :c=>:d}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...