可以以位置和关键字两种方式提供的参数吗?

时间:2020-02-14 14:48:02

标签: ruby arguments keyword-argument positional-parameter

在Python中,始终可以将位置参数作为关键字参数提供(我们不会在可能是错误的情况下深入研究Python-C扩展):

def foo(bar=None):
    print(bar)

foo("aaa")
foo(bar="aaa")

我想实现与Ruby中的bar相同的效果。但是bar = nilbar: nil都不起作用:

  • def foo bar = nil仅用于位置,并且以foo(key: value)传递的参数将被收集到哈希中并作为下一个位置参数提供,而foo(bar = value)则分配给局部变量{{ 1}}并按位置传递它(而不是匹配参数名称)。
  • bar仅适用于关键字。除了以def foo bar: nil的形式提供bar

恐怕在Ruby中不可能有一个既可以按位置又可以按关键字传递的参数。是吗?

我只需要使用Ruby 2.5及更高版本。

1 个答案:

答案 0 :(得分:0)

最接近Ruby的是:

def foo(bar=nil, **kwargs)
  bar = bar || kwargs[:bar]
end

这不好,因为该方法现在可以接受任何关键字参数。

Ruby不允许您重复参数名称:

irb(main):022:0> def foo(bar = nil, bar: nil)
irb(main):023:1> end
Traceback (most recent call last):
SyntaxError ((irb):22: duplicated argument name)
def foo(bar = nil, bar: nil)

虽然这可能是Python中的一个不错的功能-但它不是Ruby-eske。在Ruby中,将哈希传递给方法遵循与定义哈希相同的语法-因为这正是您正在做的事情。