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

StackOverflow https://stackoverflow.com/questions/472129

  •  19-08-2019
  •  | 
  •  

Вопрос

Это всегда вынуждает нас возвращать один параметр в случае, если мне нужно вернуть несколько, скажем, List и String. Это ограничение отсутствует в аргументах функции.

Это было полезно?

Решение

Эта проблема заключается в том, что пытаются решить функциональные языки, такие как F #, haskell и т. д. Проблема заключается в том, что в аппаратном обеспечении возвращаемое значение функции было первоначально возвращено через регистр ЦП, поэтому вы можете вернуть только одно значение. Синтаксис C, переданный по этому наследию, и C ++ (и C #, Java) также унаследовали это.

Другие советы

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

Это также позволяет вам ДОКУМЕНТИТЬ, что возвращает ваша функция так же, как параметры задокументированы.

На самом деле, некоторые языки делают то, что вам нужно. Например, Python, посмотрите на этот код. Возвращает 2 значения: 1 строку и другое int.

>>> def myFunc():
...   string_val = "techmaddy"
...   int_val = 10
...   return string_val, int_val
...
>>>
>>> s, i = myFunc()
>>>
>>> print s
techmaddy
>>>
>>> print i
10

Надеюсь, это поможет.

PS: Я думаю, что под прикрытием Python помещает его в список и распаковывает. Я не очень хорошо знаю Python, чтобы сказать вам, что именно он делает.

или верните Object [] из вашего метода и выполните

return new Object[] { list, string};

Если вам нужно больше параметризованных типов возврата, вы можете создать Pair < X, Y > классы, или Triplet < Z, Y, Z > и вернуть те.

Javascript, к счастью для вас, является динамическим языком. Это означает, что вы можете создать любой объект и вернуть его. Это эффективно соответствует вашему требованию иметь & Quot; параметризованный & Quot; возвращаемое значение, хотя и довольно нетипичным способом.

Например:

function stuff() {
    return {
        "foo": "a",
        "bar": "b"
    }
}

var theStuff = stuff();
alert(theStuff.foo + theStuff.bar); // should output "ab"

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

public interface Results<R> {
    public void processing(String stage);
    public void success(String mesg, R result);
    public void successes(String mesg, List<R> result);
    public void thrown(Throwable t);
}

public void process(Results<R> results, String text, List<String> data);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top