如何像rails一样声明一个带有关键字参数的方法。一些例子可能是
Person.find(:all, :conditions => "...").
如何使用符号创建与上述类似的方法?
我对红宝石很新。提前谢谢!
答案 0 :(得分:37)
Ruby实际上没有关键字参数。 Rails正在利用Ruby的一个功能,它可以省略哈希周围的大括号。例如,对于find
,我们真正称之为:
Person.find(:all, { :conditions => "...", :offset => 10, :limit => 10 } )
但是如果哈希是方法的最后一个参数,你可以省略大括号,它仍然会被视为哈希:
Person.find(:all, :conditions => "...", :offset => 10, :limit => 10)
您可以在自己的方法中使用它:
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
然后叫它:
explode :message => "Meh.", :count => 3
或者不带参数调用它,导致使用所有默认值:
explode
答案 1 :(得分:7)
自Ruby 2.0起,ruby does have keyword arguments。
def my_method(arg1, name: 'defaultName', number: 0)
puts arg1, name, number
end
答案 2 :(得分:6)
我同意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
请注意使用访问器方法,以便在输入关键字时输入NoMethodError。调用行为是:
explode(:message => "Okay") # works
explode(:msg => "Oops") # raises ArgumentError
gem还提供了一些您可能或可能不关心的其他功能,例如能够指示需要关键字。我现在已经愉快地使用它了一段时间。
(免责声明:我是宝石的作者。)
答案 3 :(得分:1)
您只需要定义一个方法,其中一个参数是哈希值。实际上非常简单。
def method(arg1, params)
name = params[:name]
number = params[:number]
然后称之为:
method(arg1, :name => 'Eric', :number => 2)
两个注释:
答案 4 :(得分:0)
由于Ruby是动态输入的,只需执行:
def my_method(arg1, arg2)
#things
end
示例:
my_method(:test, {:somehash => "yay"})
或
my_method :test, :somehash => "yay"
或
my_method(:test, :somehash => "yay")
答案 5 :(得分:0)
Ruby 2.0引入了真正的关键字参数,Ruby 2.1添加了必需的关键字参数。
在https://chriszetter.com/blog/2012/11/02/keyword-arguments-in-ruby-2-dot-0/上发表了一篇很好的文章,我从那里借了一些例子:
Ruby 2.0 +:
def exclaim(text, exclamation: '!', number: 7)
text + exclamation * number
end
exclaim('hello', number: 4) #=> 'hello!!!!'
# equivalent:
exclaim('hello', {:number => 4}) #=> 'hello!!!!'
Ruby 2.1 +:
def exclaim(text, exclamation: '!', number:)
text + exclamation * number
end
exclaim('Yo', number: 5) # => 'Yo!!!!!'
exclaim('Yo') # raises: ArgumentError: missing keyword: number