1

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

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

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

我想达到与barRuby 相同的效果。但是既不工作bar = nil也不bar: nil工作:

  • def foo bar = nil仅位置,传递的参数foo(key: value)将被收集到哈希中并作为下一个位置参数提供,而foo(bar = value)分配给局部变量bar并按位置传递(而不是匹配参数名称)。
  • def foo bar: nil仅限关键字。bar除了形式之外,没有办法提供f(bar: value)

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

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

4

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

于 2020-02-14T17:24:28.800 回答