2011-12-05 144 views
1

我正在將一個函數傳遞給另一個運行良好的函數。假設函數「inner」被傳遞給「outer」函數。我的問題是,我希望函數「outer」能夠檢查函數「inner」和它們的類型中是否有任何參數。我將內部函數用作回調函數,因此具有特定類型的一個參數非常重要。我想盡早地發現任何問題,所以需要「外部」功能來檢查。Flex:傳遞函數並檢查參數

如何檢查函數的參數?這在Flex中可能嗎?

感謝

+1

它是否必須在編譯時或運行時檢查好嗎? – RIAstar

+0

理想的編譯時間,但我不認爲這是可能的。我認爲運行時間很好。我只想盡快解決任何問題。 – RNJ

回答

2

在編譯時

事實上它可能有編譯時檢查。這取決於你願意做出多大的飛躍。爲此,您必須在編寫代碼時使用haXe代替ActionScript,並在編譯時使用targeting the Flash platform。 haXe function types on Devboy's blog有很好的閱讀。

在運行時

如果你不想去那麼遠,這裏是如何做到這一點在AS:你必須使用describeType()功能。假設你有一個測試類像這樣的:

public class TestClass {  
    public function test(s:String):void {} 
} 

現在,我們可以通過書面形式獲取有關其功能的信息:

var info:XML = describeType(TestClass); 

某處在該XML對象將有看起來像這樣的節點:

<method name="test" declaredBy="net.riastar.test::TestClass" returnType="void"> 
    <parameter index="1" type="String" optional="false"/> 
</method> 

有它!所有你需要的信息來做你的檢查。 但是這種方法有一個很大的缺陷:describeType方法效率不高。如果你必須這麼做,它會減慢你的應用程序。您可以使用緩存策略來避免這種情況。或者看看as3-commons-reflect項目,它會照顧你的緩存。

+0

如果你願意稍微寬鬆一點,你可以看看函數的長度參數,以瞭解它所需的參數數量。 –

+0

您的方法名稱是'test',但XML中的名稱是'start'。這是一個錯字嗎? – merv

+0

@merv複製/粘貼錯誤。立即修復。感謝您指出了這一點。 – RIAstar