Это просто произвольное правило, разработанное разработчиками этих конкретных языков. Нет абсолютно никакой технической причины, по которой это ограничение должно присутствовать.
Отлично работает в 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)
Обязательные параметры в начале списка параметров связаны слева направо от начала списка параметров. Обязательные параметры в конце списка параметров связаны справа налево от конца списка аргументов. Необязательные параметры связаны слева направо от начала списка оставшихся аргументов. Все оставшиеся аргументы связаны с остальными аргументами.