В чем причина того, что современные языки программирования позволяют возвращать значение только одного метода?

В чем причина того, что современные языки программирования позволяют возвращать значение только одного метода?

Я хотел бы знать несколько причин, почему, например. Java не позволяет иметь метод

public String, Car, Driver exampleMethodName(String name, Car car, Driver driver);

и назначьте возвращаемые значения, например. так:

String name;
Car ford;
Driver john;
name, ford, john = exampleMethodName(String name, Car car, Driver driver)

Использование той же концепции и синтаксиса, что и для параметров во время вызова метода.

Это невозможно на большинстве языков, но почему? Есть несколько способов решить эту проблему, например, с помощью массивов, списков или пользовательских объектов.

Какая концепция выступает против наличия разных (разных типов) нескольких возвращаемых значений?


person Dominik Feininger    schedule 02.03.2014    source источник
comment
потому что вы можете использовать бобы!   -  person donfuxx    schedule 03.03.2014
comment
Голосование по закрытию как в первую очередь основанное на мнении. Кстати, Go — контрпример.   -  person Paul Bellora    schedule 03.03.2014
comment
@PaulBellora, как и питон   -  person Jason    schedule 03.03.2014
comment
Как бы вы присвоили возвращаемое значение переменной?   -  person tom    schedule 03.03.2014
comment
Это может ответить на вопрос: programmers.stackexchange.com/questions/118703/   -  person justderb    schedule 03.03.2014
comment
@tom: языки, которые допускают несколько возвращаемых значений, также обычно допускают присвоение нескольких переменных, например. foo, bar := baz(7).   -  person ruakh    schedule 03.03.2014
comment
Не обязательно, чтобы функции не существовали по какой-то причине. Функция не существует, пока кто-то не придумает ее и не сделает. Вторая часть самая важная. Идея — это эфемерное ничто, пока кто-то не воплотит ее в жизнь. Состояние существования по умолчанию — несуществование.   -  person John Kugelman    schedule 03.03.2014
comment
Многие языки допускают передачу по ссылке (например, C/C++), что позволяет вам изменять содержимое значений в их контрольной точке, что делает необходимость возврата нескольких результатов избыточной, это также известно как побочный эффект функции, который необходимо быть сбалансированным с хорошей документацией - аргумент для другого дня. Поскольку многие языки используют C/C++ в качестве основы, они склонны следовать этой парадигме единственного результата функции/метода. Я уверен, что есть много других технических проблем. Мне было бы более любопытно, нужно ли делать это лично   -  person MadProgrammer    schedule 03.03.2014
comment
Как вы хотите использовать этот метод? Строковая переменная Car Driver = exampleMethodName(name, car, driver);   -  person java-love    schedule 03.03.2014
comment
@justderb Другая проблема. Java разрешает несколько операторов возврата, но не возвращает несколько значений из одного.   -  person Martin Smith    schedule 03.03.2014
comment
В некоторых языках есть кортежи, но это не совсем то же самое.   -  person Sotirios Delimanolis    schedule 03.03.2014
comment
так что вам нужен метод, который возвращает String, Car и Driver? Просто создайте bean-компонент с полями: mName, mCar, mDriver и верните его в свой метод.   -  person donfuxx    schedule 03.03.2014
comment
В Java вы можете возвращать несколько значений внутри объекта класса. класс ReturnResult { Строка result1; результат2; } Метод ReturnResult() { вернуть новый ReturnResult(...); } В C, C++, C# и т. п. вы можете передавать несколько аргументов в режиме ввода/вывода с помощью указателей (ссылок), где вы можете изменять аргументы внутри тела функции. // C void functionCall(int a, char*b); // C++ void functionCall(int &a, string &b); // C# void functionCall(ref int a, ref string b);   -  person stackoverflowuser2010    schedule 03.03.2014
comment
почему этот вопрос был отложен? Это отличный вопрос.   -  person stackoverflowuser2010    schedule 03.03.2014
comment
@ stackoverflowuser2010 Скорее всего, он только что получил кучу довольно спекулятивных ответов.   -  person Martin Smith    schedule 03.03.2014
comment
@ stackoverflowuser2010 Потому что ответа нет. Как отмечает Джон Кугельман, даже не обязательно быть ответа.   -  person user207421    schedule 03.03.2014
comment
Потому что в контексте стандартной алгебраической записи операторов можно использовать только один результат. Чтобы получить множественные результаты, потребовалось бы изобрести новую нотацию, а подходящей еще не всплыло на поверхность.   -  person Hot Licks    schedule 03.03.2014
comment
Отредактировал вопрос и ответил на @java-love, чтобы назначить несколько переменных. Удалил свое мнение.   -  person Dominik Feininger    schedule 03.03.2014
comment
@HotLicks В 1980-х годах в OOPSLA было предложение для нескольких l-значений, например. 'а, б, с = е (х, у, г);' Это также было бы очень удобно для свопов, например. 'а, б = б, а;' Я не знаю, чтобы кто-нибудь когда-либо реализовывал это во что-либо.   -  person user207421    schedule 03.03.2014
comment
@EJP - Как я уже сказал, ничего никогда не всплывало на поверхность. У Мульты он будет, если я когда-нибудь до него доберусь. Но сначала мне нужно написать пьесу и книгу.   -  person Hot Licks    schedule 03.03.2014
comment
Что касается того, почему это было отложено, я думаю, прочитайте Хороший субъективный, плохой субъективный . И, как некоторые указали, некоторые языки допускают несколько возвращаемых значений, поэтому это превращает вопрос в нечто большее, например, почему некоторые языки ...? в этом случае нет 1 ответа.   -  person Radiodef    schedule 03.03.2014
comment
Я считаю, что этой функции не существует, потому что оператор = больше не будет атомарным. И это привело бы к некоторой путанице.   -  person EasterBunnyBugSmasher    schedule 03.03.2014
comment
@DirkHaase: я не уверен, какой язык вы имеете в виду, но IME = все равно обычно не является атомарным по умолчанию.   -  person ruakh    schedule 03.03.2014
comment
@Ruakh Ты меня смущаешь. обычно не атомарный по умолчанию? Звучит так, как будто я могу настроить java так, чтобы он был атомарным или нет. А я про джаву. = является атомарным в java. Вы не можете назначить половину указателя.   -  person EasterBunnyBugSmasher    schedule 03.03.2014
comment
@DirkHaase: по умолчанию я имел в виду без (скажем) volatile. Это не конфигурация уровня языка, а конфигурация уровня переменных. :-) Но для вашего более важного вопроса - возможно, вы не можете назначить половину указателя, но не все назначения в Java относятся к указателям. См. вопрос SO длинные и двойные назначения не являются атомарными - какое это имеет значение?.   -  person ruakh    schedule 03.03.2014


Ответы (1)


Вероятно, причина в том, что по определению у функции должен быть ровно один выход.

http://en.wikipedia.org/wiki/Function_(математика)

person Andres    schedule 02.03.2014
comment
Конечно, в том же определении также говорится, что функция должна иметь ровно один вход, что не является требованием, предъявляемым большинством языков. (Есть некоторые языки с этим свойством, особенно функциональные языки, такие как Standard ML и Haskell, но это явно не тот язык, который имеет в виду ОП.) - person ruakh; 03.03.2014
comment
Это продолжается до тех пор, пока вы не пойдете туда и не найдете этот раздел: Функции с несколькими входами и выходами - person Luiggi Mendoza; 03.03.2014
comment
@ruakh Это не говорит ничего подобного. Это конкретно относится к «входной переменной (переменным)» и к «кортежу входных данных (если функция принимает более одного входного значения)». - person user207421; 03.03.2014
comment
@EJP: функция определяется как сопоставление одного входа (прообраза) с одним выходом (изображением). ОП ссылается на статью в Википедии, которую вы, кажется, цитируете, но цитируете довольно выборочно; в самом первом предложении говорится, что каждый вход связан ровно с одним выходом. (Статья противоречива по этому поводу по той простой причине, что математики гибки в отношении термина функция и позволяют контексту подразумевать используемое обобщение; но базовое определение подразумевает один вход и один выход, и оба они могут быть обобщены.) - person ruakh; 03.03.2014
comment
Это просто тавтология. - person Hot Licks; 03.03.2014
comment
@ruakh Я цитирую то, что там написано. Вы, кажется, сами не дошли до первого предложения. Я не вижу несоответствия. Я математик по образованию и никогда не слышал о правиле с одним аргументом. Есть домен и диапазон, и оба являются множествами. - person user207421; 03.03.2014
comment
@EJP: Re: есть домен и диапазон, и оба являются наборами: да, точно. Домен A, диапазон a. Функция сопоставляет каждое отдельное входное значение в домене с одним выходным значением в диапазоне. Что вы не получаете? - person ruakh; 03.03.2014
comment
Ничто в математическом определении функции не исключает возможности того, что вещь, которую она возвращает, является той или иной формой агрегата. Например, в некоторых областях обычно используются функции, возвращающие векторы или матрицы. - person supercat; 23.12.2014