为什么可选参数必须出现在声明的末尾
2022-09-02 03:58:29
在我见过的所有支持可选参数的编程语言中,都有一种模仿,即可选参数必须出现在声明的末尾。在可选项目之后不能包含必需的参数。这是什么原因?我想这可能是编译器/解释器的要求。
在我见过的所有支持可选参数的编程语言中,都有一种模仿,即可选参数必须出现在声明的末尾。在可选项目之后不能包含必需的参数。这是什么原因?我想这可能是编译器/解释器的要求。
好吧,如果他们在前面,你会如何发现他们何时停止供应?唯一的方法是,如果可选参数之后的变量类型不同。有点奇怪的要求,所以你只是强制它们成为最后一个是有道理的(省去了检测“final”可选参数的复杂规则的麻烦)。
此外,这是调用函数时最自然的方法。
这只是这些特定语言的设计者制定的任意规则。绝对没有技术原因可以解释为什么应该有这种限制。
它在Ruby中工作得很好:
def foo(m1, m2, o1='o1', o2='o2', *rest, m3, m4)
return m1, m2, o1, o2, rest, m3, m4
end
foo(1, 2, 3, 4)
# => [1, 2, 'o1', 'o2', [], 3, 4]
foo(1, 2, 3, 4, 5)
# => [1, 2, 3, 'o2', [], 4, 5]
foo(1, 2, 3, 4, 5, 6)
# => [1, 2, 3, 4, [], 5, 6]
foo(1, 2, 3, 4, 5, 6, 7)
# => [1, 2, 3, 4, [5], 6, 7]
foo(1, 2, 3, 4, 5, 6, 7, 8)
# => [1, 2, 3, 4, [5, 6], 7, 8]
必须提供所有必需参数:
foo(1, 2, 3)
# => ArgumentError: wrong number of arguments (3 for 4)
如果没有 rest 参数,则提供超过 number_of_mandatory + number_of_optional 个参数是错误的:
def bar(m1, m2, o1='o1', o2='o2', m3, m4)
return m1, m2, o1, o2, m3, m4
end
bar(1, 2, 3, 4, 5, 6, 7)
# => ArgumentError: wrong number of arguments (7 for 6)
参数列表开头的必需参数从参数列表的开头从左到右绑定。参数列表末尾的必需参数从参数列表的末尾从右到左绑定。可选参数从其余参数列表的开头从左到右绑定。所有剩余的参数都绑定到 rest 参数。