3

这总是迫使我们返回一个参数,以防我需要返回多个参数,比如一个列表和一个字符串。函数参数中不存在此限制。

4

6 回答 6

8

这个问题是 F#、haskell 等函数式语言试图解决的问题。问题是在硬件中,函数的返回值最初是通过 CPU 寄存器返回的,所以你只能返回一个值。C 语法继承了这一传统,C++(以及 C#、Java)也继承了这一点。

于 2009-01-23T07:03:55.097 回答
4

事实上,有些语言可以满足您的需求。例如 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,无法告诉你它到底做了什么。

于 2009-01-23T07:07:41.033 回答
4

如果您需要经常这样做,那么创建一个类来保存结果并返回它。

这也允许您以与记录参数相同的方式记录您的函数返回的内容。

于 2009-01-23T21:36:02.730 回答
3

或者,从您的方法中返回 Object[],然后执行

return new Object[] { list, string};

如果您需要更多参数化的返回类型,您可以创建 Pair<X,Y> 类或 Triplet<Z,Y,Z> 并返回它们。

于 2009-01-23T07:58:28.683 回答
1

幸运的是,Javascript 是一种动态语言。这意味着您可以构造任何类型的对象并将其返回。这有效地满足了您对具有“参数化”返回值的要求,尽管是以一种相当不安全的方式。

例如:

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

var theStuff = stuff();
alert(theStuff.foo + theStuff.bar); // should output "ab"
于 2009-01-28T08:01:38.040 回答
0

处理复杂返回行为的方法是传递方法调用的接口。例如

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);
于 2009-01-23T21:52:21.370 回答