def a_method(*args)
...
end
通常,当我们编写这段代码时,我们会得到存储在args
变量中的所有方法参数的列表.
def a_method(*)
...
end
这是相同的匿名形式.我们接受任意数量的参数,但不希望为该列表变量命名.现在,这与Python中的*
不同(它实际上只是丢弃了参数).在Ruby中,我们没有给参数列表命名,但我们仍然可以将其拆分到另一个参数列表中.所以虽然这isn't是合法的
def a_method(*)
# Should've just named it in the first place :(
args = *
...
end
另一方面,这是
def a_method(*)
another_method(*)
end
并将参数传递给another_method
.它相当于
def a_method(*args)
another_method(*args)
end
使用Ruby 3关键字参数也可以做到这一点
def a_method(**)
another_method(**)
end
请注意,如果您打算转发all个参数,则应使用省略号语法.
def a_method(...)
another_method(...)
end
当委托关键字参数时,单独的*
会表现得很滑稽.例如,
def foo(*args, **kwargs)
p args
p kwargs
end
def bar(*)
foo(*)
end
foo(1, a: 1) # Prints [1] then {:a=>1}
bar(1, a: 1) # Prints [1, {:a=>1}], then {}
当直接调用foo
时,命名参数语法被传递给**kwargs
,但当通过bar
委托时,它被转换为散列,然后传递到*args
.最重要的是,*
也不会转发块参数,而...
是通用的"将所有位置参数、命名参数和块参数向前传递".