可以以位置和关键字方式提供的参数?
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 = nil
和bar: 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 中,将哈希传递给方法遵循与定义哈希相同的语法 - 因为这正是您正在做的。
【讨论】:
以上是关于可以以位置和关键字方式提供的参数?的主要内容,如果未能解决你的问题,请参考以下文章