我正在尝试做类似的事情:
def foo(mode= :serial)
if (mode == :serial) then
self.send(:bar, "one_type")
else
self.send(:bar,"second_type",:T5)
end
end
我当然可以这样打出来。
但我最近尝试扩展它以包含第二个函数,如下所示:
def foo(mode= :serial)
if (mode == :serial) then
self.send(:bar, "one_type")
self.send(:foobar, "one_type",20)
else
self.send(:bar,"second_type",:T5)
self.send(:foobar, "one_type",20,:T5)
end
end
我仍然可以继续,但我对自己说,这里有一个模式,我应该把论点抽象到另一个层面,让它更简单。
所以我想做的事情是这样的:
arg_arr = [:bar, "one_type"]
arg_arr_2 = [:foobar, "one_type", 20]
if (mode == :serial) then
self.send(arg_arr)
self.send(arg_arr_2)
else
arg_arr << :T5
arg_arr2 << :T5
self.send(arg_arr)
self.send(arg_arr2 )
end
我尝试了一些其他的想法。each,.inspect,但没有什么可以工作的(通常的错误是不能将数组转换为字符串,我猜这是指它将数组视为整个函数名的事实)。如果我显式地说“使用数组元素[0],[1]等,我就可以做到这一点,但这似乎很浪费。
有没有一种方法可以实现这一点,而不必编写硬编码到参数数量的代码?
3条答案
按热度按时间ffx8fchx1#
试试这个
都打印
splat运算符
*
对数组进行打包或解包。ccrfmcuu2#
几年前我做了你现在正在尝试的事情。在方法参数前面加上星号,你可以在函数中接收任意多的参数。所以你不需要知道给定参数的个数。这叫劈啪声
将你的值作为一个前面有星号的数组发送,它也会工作。
我用一个irb控制台测试了以下内容:
或者发送任意数量的单个参数:
如果您有固定数量的参数,这将工作:
vu8f3i0k3#
首先,你不应该使用
send
。你可以使用public_send
、Method#call
或者仅仅是bar(...)
,如果你知道方法名的话。齐次参数
如果参数是均匀的(例如例如,它们是同一个类的示例),你可以把它们放在一个数组中,并使用这个数组作为参数:
它输出:
示例
稍微重构一下你的代码,它可能会变成:
它输出:
异构参数
对于可能属于不同类的未知数量的参数,可以使用splat运算符(documentation):
它输出:
您的示例将变为:
它输出: