将哈希作为函数参数处理

时间:2011-03-15 22:29:33

标签: ruby-on-rails ruby ruby-on-rails-3 hash methods

我正在使用Ruby on Rails 3,我正在尝试将哈希作为函数参数处理。

例如,如果我以这种方式陈述一个函数:

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

我想传递给function_name一个类似

的哈希
{"key1"=>"value_1", "key2"=>"value2", "..." => "..."}

然后在函数内部使用它。

什么是最佳\常见(Rails)方式呢?

P.S。:我在某个地方看到了extract_option!方法,但我不知道在哪里可以找到一些文档以及我是否需要它来完成我的目标。

3 个答案:

答案 0 :(得分:15)

只需使用您提供的定义:

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]之类的内容。

答案 1 :(得分:3)

在您的示例中声明它的方式将正常工作。

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

function(:item => "Something")

在上面的案例中,item == "Something"need_milk == falsecow == nil

extract_options只是通过Rails添加到Array和Hash类。

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

如果您计划在args中使用多种不同类型的参数,但如果您只想要Hash个选项,那么您的原始方式就可以了。

以下是extract_options! Rails中代码的Gist我个人在我的代码中使用它,只需将其写入外部文件并将其放入我的项目中。

答案 2 :(得分:-4)

Ruby使这很简单,你已经做得很好了。

这是一个诗歌模式(最小的,DSL风格)的例子:

 def f x = {}
   p x
 end

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

 f
 {}

 f :a => :b, :c => :d
 {:a=>:b, :c=>:d}