2009-01-23 73 views
3

这总是迫使我们返回一个单一的参数,以防我需要返回多个,比如一个List和一个String。这个限制在函数参数中没有。为什么函数没有参数化返回类型,因为它有参数化输入?

+0

你能告诉我们一些代码来描述你想要做什么? – 2009-01-23 06:58:09

+0

如果我们想将一个List和一个String传递给一个函数,我们可以将它作为process(List,String)来完成。 如果我们想返回一个String和List,我必须创建一个String和List作为参数的对象并返回Object。 – Techmaddy 2009-01-23 07:03:30

+0

@Techmaddy - 它的游戏在这里......我会问这个问题,然后你来回答,我会接受你的回答....天真!请不要污染。 – 2009-01-23 07:45:18

回答

8

这个问题是诸如F#,haskell等函数式语言试图解决的问题。问题在于,在硬件中,函数的返回值最初是通过CPU寄存器返回的,因此您只能返回一个值。在这个传统和C++(和C#,Java)上传递的C语法也继承了这一点。

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,告诉你它究竟做了什么。

3

,或者返回对象[]从你的方法,并做

​​

如果您需要更多的参数返回类型,你可以创建对< X,Y >类或三重< Z,Y,Z >并返回这些。

4

如果您需要频繁地执行此操作,请创建一个类来保存结果并返回该结果。

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

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

对你而言,幸运的是,Javascript是一种动态语言。这意味着您可以构建任何想要的对象并将其返回。这有效地满足了您具有“参数化”返回值的要求,尽管采用了非常安全的方式。

例如:

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

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