def method(a, b='a', c, *d)
[a,b,c, d]
end
p method(1,2,3,4)
不工作,我不明白为什么,如果我们删除 b 参数一切正常。语法规则说您可以将具有默认值的参数放在 splat 参数之前。
最佳答案
只要具有默认值的变量可以被解释为(唯一的)splat 的初始元素,具有默认值的变量和 splat 变量就可以存在并共存。
因此,这些都可以工作:
def good(a = :a, b); [a,b]; end
def good(a = :a, *b); [a,b]; end
def good(a, b = :b, *c); [a,b,c]; end
但这些不会:
def bad(*a, b = :b); [a,b]; end # default after the splat
def bad(a = :a, b, c = :c); [a,b,c]; end # parsing would need two splats
def bad(a = :a, b, *c); [a,b,c]; end # parsing would need two splats
def bad(*a, b = :b, c); [a,b,c]; end # default after the splat
(老实说,我不知道是什么实现细节阻止 Ruby 在 splat 后立即接受默认值,前提是没有歧义。但我猜这是为了避免在 splat 上循环两次而不是一次,即性能,并且可能还有其他原因可能与 Ruby 计算方法的元数的方式有关。)
关于ruby - 为什么这个 splat 方法调用在 Ruby 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20801426/