Ruby多个命名参数

时间:2010-01-10 20:57:54

标签: ruby methods arguments

我对ruby很新,我正在尝试使用rails框架编写Web应用程序。通过阅读,我看到这样的方法被称为:

some_method "first argument", :other_arg => "value1", :other_arg2 => "value2"

您可以传递无限数量的参数。

如何在ruby中创建一个可以这种方式使用的方法?

感谢您的帮助。

4 个答案:

答案 0 :(得分:17)

这是有效的,因为如果以这种方式调用方法,Ruby假定值为Hash

以下是如何定义一个:

def my_method( value, hash = {})
  # value is requred
  # hash can really contain any number of key/value pairs
end

你可以这样称呼它:

my_method('nice', {:first => true, :second => false})

或者

my_method('nice', :first => true, :second => false )

答案 1 :(得分:3)

这实际上只是一个以哈希为参数的方法,下面是一个代码示例。

def funcUsingHash(input)
    input.each { |k,v|
        puts "%s=%s" % [k, v]
    }
end

funcUsingHash :a => 1, :b => 2, :c => 3

在此处了解有关哈希的更多信息http://www-users.math.umd.edu/~dcarrera/ruby/0.3/chp_03/hashes.html

答案 2 :(得分:1)

也许* args可以帮到你?

def meh(a, *args)
 puts a
 args.each {|x| y x}
end

此方法的结果是

irb(main):005:0> meh(1,2,3,4)
1
--- 2
--- 3
--- 4
=> [2, 3, 4]

但我更喜欢我的脚本中的this method

答案 3 :(得分:0)

您可以将最后一个参数作为可选哈希来实现:

def some_method(x, options = {})
  # access options[:other_arg], etc.
end

但是,在Ruby 2.0.0中,通常最好使用名为keyword arguments的新功能:

def some_method(x, other_arg: "value1", other_arg2: "value2")
  # access other_arg, etc.
end

使用新语法而不是使用哈希的优点是:

  • 访问可选参数的输入较少(例如other_arg而不是options[:other_arg])。
  • 可以很容易地为可选参数指定默认值。
  • Ruby会自动检测调用者是否使用了无效的参数名称并抛出异常。

新语法的一个缺点是你不能(据我所知)轻松地将所有关键字参数发送到其他方法,因为你没有代表它们的哈希对象。

值得庆幸的是,调用这两种方法的语法是相同的,因此您可以在不破坏良好代码的情况下从一种方法更改为另一种方法。