方法的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)
两个说明:
- 在Ruby中,在大多数情况下调用方法时,不需要在{}中包围参数哈希,除非你有一些复杂的事情,比如传递多个哈希值。 在这种情况下,请确保用{}包围这些参数
- 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