2009-07-30 38 views
1

我很想知道這一點。爲什麼來自面向對象的語言的所有功能都只允許返回一個值(常規)

無論何時寫入一個必須返回多個值的函數,我必須使用按引用傳遞或在其中創建數組存儲值並傳遞它們。

爲什麼所有Object Orinented語言函數都不允許返回多個參數,因爲我們將它們作爲輸入傳遞。像這樣做有限制的語言的任何內置結構。

如果我們被允許這樣做,你認爲它會很有趣又簡單嗎?

+4

這不是真的;有些語言支持元組。 – 2009-07-30 23:36:54

+0

@看看下面的討論。 – 2009-07-30 23:58:00

+0

當我發佈該評論時,以下沒有任何討論。 – 2009-07-31 22:10:11

回答

2

這很可能是因爲處理器被設計的方式,因此被用於現代語言,如Java或C#。處理器可以將多個東西(指針)加載到參數寄存器中,但只有一個包含指針的返回值寄存器。

我的確同意,並非所有的OOP語言都只支持返回一個值,但對於那些「顯然」做的,我認爲這是原因。

此外,爲了在C/C++中返回一個元組,對或結構體,本質上,編譯器正在返回一個指向該對象的指針。

+0

是的,但爲什麼不能使用多個參數,而不是將多個值分配給相同的參數。 – rkb 2009-07-30 23:39:37

+0

你是什麼意思的多個值/參數? – 2009-07-30 23:40:22

0

在PHP中,就像這樣,因爲唯一可以接收值的方法是將函數分配給變量(或將其放置在變量的位置)。雖然我知道array_map允許你做return something & something;

4

所有面向對象的語言都遵循這種範式是不對的。

例如在Python(來自here):

def quadcube (x): 
    return x**2, x**3 

a, b = quadcube(3) 

一個將是9和B將是27

1

第一個答案:他們不知道。許多OOP語言允許你返回一個元組。例如在python中,在C++中,你有pair<>,而在C++ 0x中,完全成熟的tuple<>在TR1中。

第二個答案:因爲這是它應該的方式。一種方法應該簡短,只做一件事,因此可以爭辯,只需要返回一件事。

3

傳統

OutTypeA SomeFunction(out OutTypeB, TypeC someOtherInputParam) 

和你

{ OutTypeA, OutTypeB } SomeFunction(TypeC someOtherInputParam) 

之間的區別只是語法糖。而且,返回單一參數類型的傳統允許以易於閱讀的自然語言result = SomeFunction(...)進行書寫。這只是便利和易用性。

是的,正如別人所說,你有一些語言的元組。

0

要返回多個參數,請返回包含這兩個參數的單個對象。

public MyResult GetResult(x) 
{ 
    return new MyResult { Squared = Math.Pow(x,2), Cubed = Math.Pow(x,3) }; 
} 

對於某些語言,您可以即時創建匿名類型。對於其他人,你必須指定一個返回對象作爲具體的類。一個OO的觀察是你最終會得到很多小班。

python的語法細節(請參閱@ Cowan的答案)取決於語言設計者。編譯器/運行時可以創建一個匿名類來保存結果給你,即使在.net CLR之類的強類型環境中也是如此。

是的,在某些情況下可以更容易閱讀,是的,它會很好。但是,如果你閱讀Eric Lippert's blog,你會經常閱讀對話的內容,並聽到他繼續講述如何實現許多很好的功能,但是每個功能都有很多努力,有些東西不會使因爲最終他們不能被證明是合理的。

0

這不是一個限制,它只是面向對象和結構化編程範例的體系結構。我不知道如果函數返回多個值是否會更有趣,但它肯定會更混亂和複雜。我認爲上述編程範例的設計者考慮過這個問題,他們可能有很好的理由不去實現這個「特性」 - 這是不必要的,因爲你可以通過將它們包裝在某種集合中來返回多個值。編程語言設計得很緊湊,所以通常不需要的功能沒有實現。

相關問題