我有一个返回两个元素数组的方法:
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
。
在这种情况下是否可以在不使用星号的情况下创建界面?
答案 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')