Нет никакого отношения: как было отмечено, может быть возвращено произвольное количество значений, даже если они должны быть "упакованы" в одно значение.
Представьте себе язык, который может только принимать один кортеж и может возвращать только один кортеж из функции (кортежи могут быть любого размера). Эти функции тогда напоминают математическую функцию, преобразующую вектор из одного пространства в другое.
Однако, несколько причин, почему это может быть так:
- Большинство функций возвращают только одно значение, которое может быть набором значений (объект, последовательность и т. Д.). Разложение одного значения поддерживается на нескольких языках, даже если «возвращается только одно значение».
- Соглашения о вызовах и сигнатуры более просты: нет особого случая / издержек, чтобы сигнализировать, что возвращаются n-значения: нет необходимости использовать часть стека для возврата нескольких значений, подойдет один регистр.
- Необходимость вписываться в целевую архитектуру: ранее, особенно языки нижнего уровня, находились под сильным влиянием компьютерной архитектуры. Например, в случае с Scala он должен работать на JVM.
- Это просто, как язык был разработан. Многие (большинство?) Языков в значительной степени заимствуют - синтаксис и / или методологии - из существующих языков. Иногда это хорошо, иногда не так хорошо. Умиротворение C # Удовлетворение Java C ++ Удовлетворение C, например: все дело в доле рынка.
- Это просто работает.
Даже при «возврате только одного значения» языки программирования уже по-разному справляются с ним. Как отмечено в посте, некоторые языки допускают декомпозицию (кортеж, возвращаемый как «декомпозированный» на два значения во время присваивания):
def multiMath (i):
return (i + i, i * i)
double, squared = multiMath(4)
# doubled is 8
# squared is 16
Кроме того, другие языки, такие как C #, в которых отсутствует декомпозиция, допускают передачу по ссылке (или эмулируют ее с помощью мутации объекта):
void multiMath (int a, out int doubled, out int squared) {
doubled = a + a;
squared = a * a;
}
int d, s;
multiMath(4, out d, out s);
// d is now 8
// s is now 16
И, конечно же ...; -)
class ANewClassForThisFunctionsReturn {
...
}
Вероятно, есть еще несколько методов, о которых я не знаю.
Удачного кодирования.