为什么可选参数必须出现在声明的末尾

Inc*_*ito 18 c# java language-agnostic language-design optional-parameters

在我所看到的支持可选参数的所有编程语言中,模仿可选参数必须出现在声明的末尾.可选项目后可能不包含必需参数.这是什么原因?我想它可能是编译器/解释器的要求.

Noo*_*ilk 16

好吧,如果他们在前面,你会怎么检测他们什么时候停止供应?唯一的方法是可选参数之后变量类型不同.这是一个奇怪的要求,所以你只需强制它们是最后一个是有道理的(省去​​了检测"最终"可选参数的复杂规则的麻烦).

此外,调用函数时这是最自然的方式.


Jör*_*tag 6

这只是这些特定语言的设计者所做出的随意规则.绝对没有技术上的理由说明为什么要限制这种限制.

它在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]
Run Code Online (Sandbox Code Playgroud)

必须提供所有必需参数:

foo(1, 2, 3)
# => ArgumentError: wrong number of arguments (3 for 4)
Run Code Online (Sandbox Code Playgroud)

如果没有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)
Run Code Online (Sandbox Code Playgroud)

参数列表开头的必需参数从参数列表的开头从左到右绑定.参数列表末尾的必需参数从参数列表的末尾开始从右到左绑定.可选参数从剩余参数列表的开头从左到右绑定.剩下的所有参数都必然会有其他参数.