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

Ruby 可以以位置方式和关键字方式提供的参数?,ruby,arguments,keyword-argument,positional-parameter,Ruby,Arguments,Keyword Argument,Positional Parameter,在Python中,位置参数始终可以作为关键字参数提供(我们不会深入研究Python-C扩展,因为这可能是错误的): def foo(bar=None): 打印(条) 富(“aaa”) foo(bar=“aaa”) 我想在Ruby中实现与bar相同的效果。但是,无论是bar=nil还是bar:nil都不能工作: def foo bar=nil仅是位置变量,作为foo(key:value)传递的参数将被收集到一个散列中并作为下一个位置参数提供,而foo(bar=value)将赋值给局部变量bar

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

def foo(bar=None):
打印(条)
富(“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)
在Ruby中,恐怕不可能有一个参数既可以按位置传递,也可以按关键字传递。是吗


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

最接近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中,将散列传递给方法的语法与定义散列的语法相同,因为这正是您要做的。

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

我强烈建议阅读此答案:我强烈建议阅读此答案: