方法的ruby关键字参数

我怎样才能像rails一样用关键字参数声明一个方法。 一些例子可能是

Person.find(:all, :conditions => "..."). 

如何使用符号创建类似于上述的方法?

我对ruby很新。 提前致谢!

Ruby实际上没有关键字参数。 Rails正在利用Ruby的一个function,它允许你省略哈希周围的大括号。 例如,使用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 

从Ruby 2.0开始,ruby 确实有关键字参数 。

 def my_method(arg1, name: 'defaultName', number: 0) puts arg1, name, number end 

我同意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还提供了一些您可能或可能不关心的其他function,例如能够指示需要关键字。 我一直在愉快地使用它一段时间了。

(免责声明:我是gem的作者。)

您只需要定义一个方法,其中一个参数是一个哈希。 它实际上非常简单。

 def method(arg1, params) name = params[:name] number = params[:number] 

然后称之为:

 method(arg1, :name => 'Eric', :number => 2) 

两个说明:

  1. 在Ruby中,在大多数情况下调用方法时,不需要在{}中包围参数哈希,除非你有一些复杂的事情,比如传递多个哈希值。 在这种情况下,请确保用{}包围这些参数
  2. Ruby是动态类型的,因此在定义方法时不需要说params是一个哈希值。

由于Ruby是动态输入的,所以只需:

 def my_method(arg1, arg2) #things end 

例:

 my_method(:test, {:somehash => "yay"}) 

要么

 my_method :test, :somehash => "yay" 

要么

 my_method(:test, :somehash => "yay") 

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