Почему делают функции на некоторых популярных языках возвращают только единственный тип результата?

Почему делают функции на некоторых популярных языках возвращают только единственный тип результата?

т.е. я имею в виду, Почему Компиляторы дают Ошибку на Следующем Синтаксисе

public int int  returnTwoIntegers(){
.......
........
}
6
задан Sagar Varpe 9 August 2011 в 12:19
поделиться

13 ответов

Даниэль Вайнреб, работавший над обоими диалектами Лиспа (в котором были множественные возвращаемые значения) и Java (в котором их не было), объясняет почему:

Когда мы добавили функцию возврата множественных значений в машинный Лисп (откуда она перешла в Common Lisp), я считаю, что желание избежать консинга было одним из серьезных мотивов. Тогда у нас не было хорошей технологии GC, и написание программ на Лиспе для тщательной минимизации consing было очень распространено.

Другой причиной была выразительность: чтобы было ясно, что функция действительно возвращает более одного результата, а не вводит маленький список "типа" (например, "два списка - дескриптор файла и булево число, говорящее, что...").

В Java я видел определения маленьких классов, единственная цель которых - быть способом возврата нескольких значений. Преимущество такого подхода в том, что типы и значения возвращаемых значений документируются (по крайней мере, если вы выберете четкие имена и вставите комментарии!). Но, на мой взгляд, он довольно многословен.

Когда я впервые просматривал раннюю спецификацию Java, я был удивлен тем, что в ней не было возможности возвращать несколько значений. Я хотел лоббировать добавление этой возможности, поэтому попытался придумать простой и очень убедительный пример использования. Мне не удалось этого сделать! Поэтому я не стал пытаться лоббировать эту идею. Разработчики Java явно пытались избежать большого количества колокольчиков и свистков (и синтаксического сахара), и в этом есть много положительного".

2
ответ дан 8 December 2019 в 02:02
поделиться

Вы можете сделать это в perl:

sub foo
{
   return (10, 20);
}

my ($a, $b) = foo();  # sets $a to 10 and $b to 20

И подобные конструкции в других языках.

0
ответ дан 8 December 2019 в 02:02
поделиться

Это помогает читать исходный код. Это ТАКОЕ дружелюбное отношение к человеку! Если бы эта функция имела более одного возвращаемого значения, эту строку нельзя было бы записать:

 if (SomeFunction(a, b) != SUCCESS)
 {
    // do error handling
 }
0
ответ дан 8 December 2019 в 02:02
поделиться

Функция возвращает ответ, почему она должна быть предназначена для того, чтобы давать больше ответов? И этот ответ может быть любой структурой данных, которая вам нравится, так что он может содержать много значений :)

0
ответ дан 8 December 2019 в 02:02
поделиться

Lua также поддерживает несколько возвращаемых значений: вы можете, например, написать следующее:

function foo()
    return 1, 2, 3
end

a, b, c, d = foo()

после выполнения a, b, c будут содержать значения 1, 2, 3, а d будет равно нулю. Таким же образом вы можете сделать следующее:

function bar()
   return true, 2, 3
end

if bar() then
   -- do something intelligent
end

оператор if в этом случае будет работать только с первым возвращенным значением - если вам нужны другие значения, вам придется сохранить их в переменных, как обычно:

a, b, c = bar()
if a then
   -- do something intelligent
end

так вы видите: в Lua все возвращаемые значения, которые не нужны, отбрасываются (например, 2, 3 в примере с if).

1
ответ дан 8 December 2019 в 02:02
поделиться

Функция должна выполнить четко поставленную задачу. Помимо того факта, что вы всегда можете вернуть массив: возможно, что-то было совершенно не так с вашим программным дизайном, если вам нужно было возвращать разные значения из разных типов данных.

Кроме того, человеку намного проще читать функцию с одним возвращаемым значением.

1
ответ дан 8 December 2019 в 02:02
поделиться

Чтобы упростить дело.

Вы всегда можете вернуть T [] , Pair , Set и т. Д. На этих языках, чтобы имитировать возврат нескольких ценности. Это решает большинство сценариев множественных возвращаемых значений.

Не стоит так сильно менять семантику языка ради такой маленькой выгоды.

Связанные вопросы

10
ответ дан 8 December 2019 в 02:02
поделиться

Функция (на языках, которые вы указали в своих тегах) имеет единственный выход , но этот выход не обязательно должен быть единственным значением . Ваш вывод может легко быть классом, который инкапсулирует любой объем данных, который вы хотите.

Также обратите внимание, что вы также можете передать несколько входных аргументов по ссылке вашей функции, тем самым увеличивая количество возвращаемых выходных данных.

18
ответ дан 8 December 2019 в 02:02
поделиться

Думаю, это заимствовано из математики. Там у вас может быть функция с несколькими параметрами и значением, которое является результатом.

f(x1, x2, ...) = y (the formula might be something like x1 + x2^2 + x3^3 + ...)

Даже если вы хотите сопоставить многомерную область с многомерным диапазоном, вы обычно пишете как:

f1(x1, x2, ...) = y1 (perhaps y1 = x1 + x2^1 + ... like above)
f2(x1, x2, ...) = y2 (and y2 = x1 - x2^2 + x3^3 - x4^4 +...)
...

, поскольку каждый y получает свою собственную математическую формулу на основе входных данных, которые в программировании просто переводятся в несколько функций, это имеет смысл разделить это вот так.

Проблема в том, что иногда формулы для y1 и y2 могут быть очень похожими или полагаться на повторение одного и того же или еще чего-то, что их совместное выполнение может иметь больше смысла. В python вы можете сделать

return a1, a2;

, а затем вызвать его как

x, y = f ();

, но в большинстве языков вы можете вернуть только одну переменную. Это не мешает вам сделать его сложным объектом с несколькими включенными значениями.

6
ответ дан 8 December 2019 в 02:02
поделиться

Функции возвращают только одно значение, потому что это способ «они» изобрел это в былые времена ассемблера. Обычно происходит то, что функция помещает возвращаемое значение в стек. Затем вызывающий абонент извлекает значение из стека. Если функция вернула больше значений, вызывающий не узнал бы, сколько значений нужно выдать, и стек будет несбалансированным (что приведет к сбою программы).

22
ответ дан 8 December 2019 в 02:02
поделиться

Думаю, в большинстве случаев достаточно одного возвращаемого значения, и математическое понятие функции (или лямбда-исчисление) также имеет одно возвращаемое значение, поэтому вполне понятно, что разработчики языка пытаются придерживайтесь «стандарта». На самом деле наличие нескольких функций, которым требуется несколько возвращаемых значений, может сбивать с толку и может быть признаком плохого дизайна, например отсутствующий составной класс.

«Классический» подход к возврату нескольких значений - использование кортежей. Некоторые языки имеют встроенный тип Tuple (например, Scala), но вы можете определить его самостоятельно на всех языках, которые поддерживают параметры типа в той или иной форме (шаблоны, универсальные шаблоны ...). Для Java существует прекрасная библиотека JavaTuple .

1
ответ дан 8 December 2019 в 02:02
поделиться

Я думаю, что вопрос касается распределения памяти и организации стека. Главное - это переключение контекста во время вызова функции. фрейм функции хранится на стеке кадр содержит переменные функции, регистры общего назначения и возвращаемые значения Я знаю это много

0
ответ дан 8 December 2019 в 02:02
поделиться

Google Go поддерживает несколько возвращаемых значений

2
ответ дан 8 December 2019 в 02:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: