我正在使用Ruby on Rails 3,我正在尝试将哈希作为函数参数处理。
例如,如果我以这种方式陈述一个函数:
def function_name(options = {})
...
end
我想传递给function_name
一个类似
{"key1"=>"value_1", "key2"=>"value2", "..." => "..."}
然后在函数内部使用它。
什么是最佳\常见(Rails)方式呢?
P.S。:我在某个地方看到了extract_option!
方法,但我不知道在哪里可以找到一些文档以及我是否需要它来完成我的目标。
答案 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 == false
和cow == 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}