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

问题描述 投票:1回答:1

在Python中,始终可以将位置参数作为关键字参数提供(我们不会在可能为false的情况下深入研究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)则分配给局部变量bar并在位置上传递(而不是参数名称的匹配)。
  • def foo bar: nil仅用作关键字。除了bar
  • 的形式,无法提供f(bar: value)

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

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

ruby arguments keyword-argument positional-parameter
1个回答
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中,将哈希传递给方法遵循与定义哈希相同的语法-因为这正是您正在执行的操作。

© www.soinside.com 2019 - 2024. All rights reserved.