在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)
则分配给局部变量{{ 1}}并按位置传递它(而不是匹配参数名称)。bar
仅适用于关键字。除了以def foo bar: nil
的形式提供bar
恐怕在Ruby中不可能有一个既可以按位置又可以按关键字传递的参数。是吗?
我只需要使用Ruby 2.5及更高版本。
答案 0 :(得分: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中,将哈希传递给方法遵循与定义哈希相同的语法-因为这正是您正在做的事情。