方法的ruby关键字参数

时间:2010-03-17 14:31:28

标签: ruby

如何像rails一样声明一个带有关键字参数的方法。一些例子可能是

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

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

我对红宝石很新。提前谢谢!

6 个答案:

答案 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)

两个注释:

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

答案 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