这总是迫使我们返回一个参数,以防我需要返回多个,比如一个List和一个String。函数参数中没有这个限制。
答案 0 :(得分:8)
这个问题是诸如F#,haskell等功能语言试图解决的问题。问题是在硬件中,函数的返回值最初是通过CPU寄存器返回的,因此您只能返回单个值。传承这种遗留的C语法和C ++(以及C#,Java)也继承了这一点。
答案 1 :(得分: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,告诉你究竟是什么。答案 2 :(得分:4)
如果你需要经常这么做,那么创建一个类只是为了保存结果并返回它。
这也允许您以与记录参数相同的方式记录函数返回的内容。
答案 3 :(得分:3)
或者,从您的方法返回Object []并执行
return new Object[] { list, string};
如果您需要更多参数化返回类型,则可以创建Pair< X,Y>类,或三联体< Z,Y,Z>并返回那些。
答案 4 :(得分:1)
幸运的是,Javascript是一种动态语言。这意味着您可以构造任何类型的对象并将其返回。这有效地满足了您具有“参数化”返回值的要求,尽管是以非常不安全的方式。
例如:
function stuff() {
return {
"foo": "a",
"bar": "b"
}
}
var theStuff = stuff();
alert(theStuff.foo + theStuff.bar); // should output "ab"
答案 5 :(得分:0)
处理复杂返回行为的方法是传递方法调用的接口。 e.g。
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);