方法的ruby关键字参数

Yan*_*ang 18 ruby

如何像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具有真正的关键字参数.然而,它们与使用last-argument哈希的约定偷偷摸摸地兼容:如果你将带有符号键的哈希传递给期望关键字的方法,Ruby会将它们展开到关键字参数中.Rails仍然没有使用Ruby 2.0的关键字参数来保持与Ruby 1.9的兼容性. (6认同)

Pie*_*ers 7

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

def my_method(arg1, name: 'defaultName', number: 0)
  puts arg1, name, number
end
Run Code Online (Sandbox Code Playgroud)


ron*_*nen 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
Run Code Online (Sandbox Code Playgroud)

请注意使用访问器方法,以便在输入关键字时输入NoMethodError.调用行为是:

explode(:message => "Okay")   # works
explode(:msg => "Oops")       # raises ArgumentError
Run Code Online (Sandbox Code Playgroud)

gem还提供了一些您可能或可能不关心的其他功能,例如能够指示需要关键字.我一直在愉快地使用它一段时间了.

(免责声明:我是宝石的作者.)