2011-03-15 218 views
9

我正在使用Ruby on Rails 3,我试图处理散列作为函数参数。处理散列作为函数参数

例如,如果我状态的功能是这样的:

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

我想传递给function_name哈希像

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

,然后使用该函数内。

什么是最好\普通(Rails)的方法呢?

P.S .:我在某处看过extract_option!方法,但我不知道在哪里可以找到一些文档,以及我是否需要该方法才能完成我的目标。

+0

我想你的意思是这样的:http://apidock.com/rails/Array/extract_options%21。但是你的例子没有利用它,除非你的签名是“def function_name(* args)”。正如Jakub所说,通过散列作为选项是完全标准的,你不得不做任何特殊的事情。 – tokland 2011-03-15 22:43:58

回答

14

只需使用你提供的定义:

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

你在你的例子中声明的方式可以正常工作。

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选项时,原来的方式是好的。

这里是一个Gist Rails的代码extract_options!我个人在工作时使用它在我的代码中,只需将它写入外部文件并将其存入我的项目。

+0

这是我最喜欢的方式。 +1代表'||假',如果用户忘记了某些东西,就可以停止炸毁的方法:) – Starkers 2014-02-05 11:03:46

-4

Ruby使这个很容易,你已经做对了。

这里是一个诗歌模式(最小,DSL式)例如:

def f x = {} 
    p x 
end 

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

f 
{} 

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