我很想知道這一點。爲什麼來自面向對象的語言的所有功能都只允許返回一個值(常規)
無論何時寫入一個必須返回多個值的函數,我必須使用按引用傳遞或在其中創建數組存儲值並傳遞它們。
爲什麼所有Object Orinented語言函數都不允許返回多個參數,因爲我們將它們作爲輸入傳遞。像這樣做有限制的語言的任何內置結構。
如果我們被允許這樣做,你認爲它會很有趣又簡單嗎?
我很想知道這一點。爲什麼來自面向對象的語言的所有功能都只允許返回一個值(常規)
無論何時寫入一個必須返回多個值的函數,我必須使用按引用傳遞或在其中創建數組存儲值並傳遞它們。
爲什麼所有Object Orinented語言函數都不允許返回多個參數,因爲我們將它們作爲輸入傳遞。像這樣做有限制的語言的任何內置結構。
如果我們被允許這樣做,你認爲它會很有趣又簡單嗎?
這很可能是因爲處理器被設計的方式,因此被用於現代語言,如Java或C#。處理器可以將多個東西(指針)加載到參數寄存器中,但只有一個包含指針的返回值寄存器。
我的確同意,並非所有的OOP語言都只支持返回一個值,但對於那些「顯然」做的,我認爲這是原因。
此外,爲了在C/C++中返回一個元組,對或結構體,本質上,編譯器正在返回一個指向該對象的指針。
是的,但爲什麼不能使用多個參數,而不是將多個值分配給相同的參數。 – rkb 2009-07-30 23:39:37
你是什麼意思的多個值/參數? – 2009-07-30 23:40:22
在PHP中,就像這樣,因爲唯一可以接收值的方法是將函數分配給變量(或將其放置在變量的位置)。雖然我知道array_map允許你做return something & something;
所有面向對象的語言都遵循這種範式是不對的。
例如在Python(來自here):
def quadcube (x):
return x**2, x**3
a, b = quadcube(3)
一個將是9和B將是27
第一個答案:他們不知道。許多OOP語言允許你返回一個元組。例如在python中,在C++中,你有pair<>
,而在C++ 0x中,完全成熟的tuple<>
在TR1中。
第二個答案:因爲這是它應該的方式。一種方法應該簡短,只做一件事,因此可以爭辯,只需要返回一件事。
的傳統
OutTypeA SomeFunction(out OutTypeB, TypeC someOtherInputParam)
和你
{ OutTypeA, OutTypeB } SomeFunction(TypeC someOtherInputParam)
之間的區別只是語法糖。而且,返回單一參數類型的傳統允許以易於閱讀的自然語言result = SomeFunction(...)
進行書寫。這只是便利和易用性。
是的,正如別人所說,你有一些語言的元組。
要返回多個參數,請返回包含這兩個參數的單個對象。
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,你會經常閱讀對話的內容,並聽到他繼續講述如何實現許多很好的功能,但是每個功能都有很多努力,有些東西不會使因爲最終他們不能被證明是合理的。
這不是一個限制,它只是面向對象和結構化編程範例的體系結構。我不知道如果函數返回多個值是否會更有趣,但它肯定會更混亂和複雜。我認爲上述編程範例的設計者考慮過這個問題,他們可能有很好的理由不去實現這個「特性」 - 這是不必要的,因爲你可以通過將它們包裝在某種集合中來返回多個值。編程語言設計得很緊湊,所以通常不需要的功能沒有實現。
這不是真的;有些語言支持元組。 – 2009-07-30 23:36:54
@看看下面的討論。 – 2009-07-30 23:58:00
當我發佈該評論時,以下沒有任何討論。 – 2009-07-31 22:10:11