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

Posted

技术标签:

【中文标题】可以以位置和关键字方式提供的参数?【英文标题】:An argument that can be supplied in both positional and keyword ways? 【发布时间】:2020-05-30 09:14:39 【问题描述】:

在 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) 则分配给局部变量 bar 并按位置传递它(而不是匹配参数名称)。 def foo bar: nil 仅限关键字。除了f(bar: value) 的形式外,没有办法提供bar

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

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

【问题讨论】:

我强烈推荐阅读这个答案:***.com/a/53955936/1596460 【参考方案1】:

您在 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 中,将哈希传递给方法遵循与定义哈希相同的语法 - 因为这正是您正在做的。

【讨论】:

以上是关于可以以位置和关键字方式提供的参数?的主要内容,如果未能解决你的问题,请参考以下文章

python函数 位置参数,关键字参数,可变参数优先级

python-参数

Python:参数传递和收集机制

Python:参数传递和收集机制

Python的位置参数、默认参数、关键字参数、可变参数区别

python函数——形参中的:*args和**kwargs