如何像rails一样声明一个带有关键字参数的方法.一些例子可能是
Person.find(:all, :conditions => "...").
Run Code Online (Sandbox Code Playgroud)
如何使用符号创建类似于上述的方法?
我对红宝石很新.提前致谢!
Sam*_*war 37
Ruby实际上没有关键字参数.Rails正在利用Ruby的一个功能,它可以省略哈希周围的大括号.例如,find我们真正称之为:
Person.find(:all, { :conditions => "...", :offset => 10, :limit => 10 } )
Run Code Online (Sandbox Code Playgroud)
但是如果哈希是方法的最后一个参数,你可以省略大括号,它仍将被视为哈希:
Person.find(:all, :conditions => "...", :offset => 10, :limit => 10)
Run Code Online (Sandbox Code Playgroud)
您可以在自己的方法中使用它:
def explode(options={})
defaults = { :message => "Kabloooie!", :timer => 10, :count => 1 }
options = defaults.merge(options)
options[:count].times do
sleep options[:timer]
puts options[:message]
end
end
Run Code Online (Sandbox Code Playgroud)
然后叫它:
explode :message => "Meh.", :count => 3
Run Code Online (Sandbox Code Playgroud)
或者在没有参数的情况下调用它,导致使用所有默认值:
explode
Run Code Online (Sandbox Code Playgroud)
从Ruby 2.0开始,ruby 确实有关键字参数.
def my_method(arg1, name: 'defaultName', number: 0)
puts arg1, name, number
end
Run Code Online (Sandbox Code Playgroud)
我同意Samir Talwar和christopherwright给出的公认答案.唯一可能的缺点是,如果您使用不正确的关键字符号作为参数或查找选项时没有警告,它最终会被忽略.如果这是你关心的事情,那么gem hash_keyword_args会解决它.这个成语是
def explode(opts={})
opts = opts.keyword_args(:message => "Kabloooie!", :timer => 10, :count => 1)
opts.count.times do
sleep opts.timer
puts opts.message
end
end
Run Code Online (Sandbox Code Playgroud)
请注意使用访问器方法,以便在输入关键字时输入NoMethodError.调用行为是:
explode(:message => "Okay") # works
explode(:msg => "Oops") # raises ArgumentError
Run Code Online (Sandbox Code Playgroud)
gem还提供了一些您可能或可能不关心的其他功能,例如能够指示需要关键字.我一直在愉快地使用它一段时间了.
(免责声明:我是宝石的作者.)
| 归档时间: |
|
| 查看次数: |
7023 次 |
| 最近记录: |