Почему все функции из объектно-ориентированного языка позволяют возвращать только одно значение (общее) - PullRequest
1 голос
/ 31 июля 2009

Мне любопытно узнать об этом.

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

Почему все функции языка Object Orinented не могут возвращать несколько параметров, когда мы передаем их в качестве входных данных. Например, есть ли какая-то встроенная структура языка, которая запрещает это делать.

Не думаете ли вы, что будет весело и легко, если нам позволят это сделать?

Ответы [ 7 ]

4 голосов
/ 31 июля 2009

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

например. в Python (с здесь ):

def quadcube (x):
    return x**2, x**3

a, b = quadcube(3)

a будет 9, а b будет 27.

3 голосов
/ 31 июля 2009

разница между традиционными

OutTypeA SomeFunction(out OutTypeB, TypeC someOtherInputParam)

и ваш

{ OutTypeA, OutTypeB } SomeFunction(TypeC someOtherInputParam)

это просто синтаксический сахар. Кроме того, традиция возврата одного типа параметра позволяет писать на простом для чтения естественном языке result = SomeFunction(...). Это просто удобство и простота использования.

И да, как говорили другие, у вас есть кортежи на некоторых языках.

2 голосов
/ 31 июля 2009

Вероятно, это связано с тем, что процессоры были спроектированы и, следовательно, перенесены на современные языки, такие как Java или C #. Процессор может загружать несколько вещей (указателей) в регистры параметров, но имеет только один регистр возвращаемого значения, который содержит указатель.

Я согласен, что не все языки ООП поддерживают возвращение только одного значения, но для тех, которые "по-видимому" делают, это, я думаю, причина.

Также для возврата кортежа, пары или структуры по этому вопросу в C / C ++, по сути, компилятор возвращает указатель на этот объект.

1 голос
/ 31 июля 2009

Первый ответ: нет. многие языки ООП позволяют возвращать кортеж. Это верно, например, в python, в C ++ у вас есть pair<>, а в C ++ 0x полноценный tuple<> находится в TR1.

Второй ответ: потому что так и должно быть. Метод должен быть коротким и делать только одну вещь, и поэтому можно утверждать, нужно только вернуть одну вещь.

0 голосов
/ 31 июля 2009

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

0 голосов
/ 31 июля 2009

Чтобы вернуть несколько параметров, вы возвращаете один объект, который содержит оба этих параметра.

public MyResult GetResult(x)
{
    return new MyResult { Squared = Math.Pow(x,2), Cubed = Math.Pow(x,3) };
}

Для некоторых языков вы можете создавать анонимные типы на лету. Для других вы должны указать возвращаемый объект как конкретный класс. Одно наблюдение с ОО - ты заканчиваешь множеством маленьких уроков.

Синтаксические тонкости python (см. Ответ @ Cowan) зависят от дизайнера языка. Компилятор / среда выполнения может создать анонимный класс для хранения результата для вас, даже в строго типизированной среде, такой как .net CLR.

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

0 голосов
/ 31 июля 2009

В PHP это так, потому что единственный способ получить значение - это присвоить функцию переменной (или поместить ее вместо переменной). Хотя я знаю, что array_map позволяет делать return something & something;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...