Ruby 可以以位置方式和关键字方式提供的参数?
在Python中,位置参数始终可以作为关键字参数提供(我们不会深入研究Python-C扩展,因为这可能是错误的):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
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 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中,将哈希传递给方法的语法与定义哈希相同,因为这正是您要做的。我强烈建议阅读此答案:我强烈建议阅读此答案: