почему функции не имеют параметризованных типов возвращаемых данных, поскольку они имеют параметризованный ввод? - PullRequest
3 голосов
/ 23 января 2009

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

Ответы [ 6 ]

8 голосов
/ 23 января 2009

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

4 голосов
/ 24 января 2009

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

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

4 голосов
/ 23 января 2009

На самом деле, некоторые языки делают то, что вам нужно. Например, 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, чтобы сказать вам, что именно он делает.

3 голосов
/ 23 января 2009

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

return new Object[] { list, string};

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

1 голос
/ 28 января 2009

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

Например:

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

var theStuff = stuff();
alert(theStuff.foo + theStuff.bar); // should output "ab"
0 голосов
/ 24 января 2009

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

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);
...