方法调用中的可选键/值

时间:2017-05-10 12:38:19

标签: ruby methods parameter-passing

这个问题严格来说是优雅地调用一个方法,其中包含可变数量的" hashified"参数。

背景

我有这个方法:

def meth(a, b, c={})
...
end

我通常称之为:

meth(123, 456, arg1: 234, arg2: 543)

不应以任何方式,形式或方式更改方法定义。

问题

现在,如果某个条件为假,我希望跳过args: 543

伪代码,不是有效的Ruby:

meth(123, 456, arg1: 234, cond ? (arg2: 543) : () )

这个是否有非常优雅,简短易懂的语法,而无需更改或修改方法定义

我尝试了什么

明显的解决方案就是......

args = { arg1: 234 }
args[:arg2] = 543 if cond
meth(123, 456, args)

太丑了。

meth(123, 456, {arg1: 234}.merge(cond ? {arg2: 543} : {})) 

没关系,但是......好吧......当实际代码稍微长一点时,不会100%可读。* / / p>

我尝试使用***运算符,但找不到更好的解决方案。

2 个答案:

答案 0 :(得分:2)

我认为你应该采用ugly解决方案。您应该优先考虑简单性和可读性,而不是代码智能性。

要回答您的原始问题,您可以执行以下操作:

args = { arg1: 234, arg2: (543 if cond) }
meth(123, 456, args)

答案 1 :(得分:0)

我会使第三个参数成为执行必要条件的方法调用。

meth(123, 457, check_cond(234, 543, object-that-contains-conditionals-data));

这比其他选择更清晰,更漂亮。