我有一个方法,看起来像这样:
def method(:name => nil, :color => nil, shoe_size => nil)
SomeOtherObject.some_other_method(THE HASH THAT THOSE KEYWORD ARGUMENTS WOULD MAKE)
end
对于任何给定的调用,我可以接受任意可选值的组合。我喜欢命名参数,因为我可以查看方法的签名来查看可用的选项。
我不知道的是,是否有一个快捷方式,我所描述的大写字母在上面的代码示例。
回到奥登时代,它曾经是:
def method(opts)
SomeOtherObject.some_other_method(opts)
end
优雅,简单,几乎是欺骗。
对于那些关键字参数,是否有一个快捷方式,或者我必须在方法调用中重新构造我的选项哈希?
6条答案
按热度按时间irlmq6kh1#
是的,这是可能的,但它不是很优雅。
您必须使用
parameters
方法,该方法返回方法参数及其类型的数组(在本例中,我们只有关键字参数)。知道了这一点,有各种方法可以使用该数组来获取所有参数及其提供的值的散列。
所以你的例子看起来像
仔细考虑使用这个。它很聪明,但以可读性为代价,其他阅读您的代码的人不会喜欢它。
您可以使用帮助器方法使其更具可读性。
**更新:**Ruby 2.2引入了
Binding#local_variables
,可以用来代替Method#parameters
。要小心,因为在方法内部定义任何其他局部变量之前,必须调用local_variables
。o2gm4chl2#
当然!只要使用双splat(
**
)运算符。它的工作原理与常规splat(
*
)类似,用于收集参数。您甚至可以将关键字参数转发给另一个方法。0ejtzxu13#
下面的语法怎么样?
为了使它工作,将
params
作为方法中的保留关键字,并将这一行放在方法的顶部。n8ghc7c14#
我玩得很开心,所以谢谢你。我的想法是
我选择返回一个数组,但你可以很容易地修改它以返回一个哈希值(例如,在初始检测后不关心参数类型)。
vc6uscn95#
@丹尼斯的回答很有用,也很有教育意义。然而,我注意到
Binding#local_variables
将返回 * 所有 * 局部变量,无论local_variables
何时执行:我提出了一个混合解决方案:
dffbzjpn6#
下面是一个例子,可以同时获取参数和关键字参数,而不管命名或
*
或**
形式如何。通过mix-in使其可重用: