Ruby:仅当非空时才将选项传递给方法

Ruby:仅当非空时才将选项传递给方法,ruby,Ruby,我得到了一个hashself.options(可能为空)和一个方法名。现在我需要调用该方法,传入选项散列,如下所示: obj.send(method_name, ...args..., self.options) 但我想支持调用根本不需要选项散列的方法。因此,如果没有给出任何选项(self.options.empty?),我不希望将空哈希传递给该方法。我能想到的最好的办法是: obj.send(method_name, ...args..., *(self.options.empty? ? [

我得到了一个hash
self.options
(可能为空)和一个方法名。现在我需要调用该方法,传入选项散列,如下所示:

obj.send(method_name, ...args..., self.options)
但我想支持调用根本不需要选项散列的方法。因此,如果没有给出任何选项(
self.options.empty?
),我不希望将空哈希传递给该方法。我能想到的最好的办法是:

obj.send(method_name, ...args..., *(self.options.empty? ? [] : [self.options]))

有更好的习惯用法吗?

如果选项为空,则不需要[]*nil返回该位置的真空度

这样行吗

obj.send(method_name, ...args..., *([self.options] unless self.options.empty?))
顺便说一下,你可以省略self,这样你就可以

obj.send(method_name, ...args..., *([options] unless options.empty?))
或者,@sawa怎么说对了,你可以扔掉
self

obj.send(method_name, ...args..., *([options.presence].compact))

我认为您应该回到您的版本,使用[]环绕self.options.presence。如果没有[],哈希将转换为数组。例如,[1,2,*{3=>4}]#=>[1,2,[3,4]]。thanx,我不明白
[]
的存在,现在我明白了。但是我的解决方案对[]不起作用。这样更好:)但是没有什么黑客感兴趣。作为大家的参考,#presence是一种Rails方法,.[@fl00r,抱歉,本来是要向上投票的,但我不会让你这么做。:(谢谢你的回答!]非常好,看起来好多了!提醒大家,这只适用于Ruby 1.9——在1.8上,如果你给出
*nil
,它将通过
nil
作为最后一个参数。
obj.send(method_name, ...args..., *([options.presence].compact))