如何在不使用星号的情况下将数组元素作为参数传递

时间:2017-04-28 22:56:27

标签: ruby

我有一个返回两个元素数组的方法:

pub   rsa4096/4CD1E9DA 2017-04-26 [C] [expired: 2017-04-28]
      Key fingerprint = 4670 59C1 7592 08B8 7FA5  313B 2A42 B6A6 4CD1 E9DA
uid         [ expired] Stuart Cardall (GIT Development Keys) <xxxxxx>
sub   rsa4096/5195E715 2017-04-26 [E] [expired: 2019-04-26]
sub   rsa4096/DB74C297 2017-04-26 [S] [expired: 2019-04-26]
sub   rsa2048/A3913A3C 2017-04-28 [] [expired: never     ]

我需要将此数组发送到另一个方法,该方法也可能需要额外的参数:

def method_from
   ....
   [value1, value2]
end 

我想要一个简单的界面:

def method_to(param1, param2, opts = {})

可以使用额外的星号:

obj2.method_to obj1.method_from
obj2.method_to obj1.method_from, option: 'value'

但代码看起来并不干净,因为我需要知道obj2.method_to *obj1.method_from, option: value 的响应结构才能调用method_from

在这种情况下是否可以在不使用星号的情况下创建界面?

1 个答案:

答案 0 :(得分:1)

当你观察到“代码看起来不干净时,因为我需要知道method_from的响应结构来调用method_to”你是在正确的轨道上,但同时,你也错过了更大的画面。你试图将一个函数的输出拟合到另一个函数的输入,通常这意味着这两个函数需要兼容。

如果method_from可以发出某种对象,你可以简单地提供给method_to你的问题就解决了,你只需要通过它。问题是这两种方法并不是为了那种方式互操作而设计的。

这意味着你正在坚持用星号做你正在做的事情,因为毕竟你想要的是一个啪啪声。替代方案是这种更为棘手的解决方案:

def method_to(*args, **options)
  param1, param2 = args.flatten

  # Rest of code
end

该方法现在可以采用以下形式的参数:

method_to(value1, value2, option: 'value')

或传递变体:

method_to([ value1, value2 ], option: 'value')