2013-07-16 45 views
4

裏面ColdFusion組件我宣佈這樣的函數:ColdFusion可以在函數參數中定義數組的類型嗎?

string function render(required Array actions) output=false { 
//... 
} 

因此函數參數只能接受一個數組。然而,我需要確保該數組只包含「ActionItem」對象(有一個ActionItem.cfc組件)

有沒有在ColdFusion中鍵入提示數組內容的方法?你在這種情況下建議什麼解決方案?

+1

CFML沒有鍵入數組。如果您真的需要確認這一點,您需要在[isInstanceOf](http://cfdocs.org/isInstanceOf)循環內執行此操作(但您可能實際上並不需要)。 –

+0

p.s.腳本中不需要'output = false' - 除非明確使用writeOutput/writeDump/etc,否則不會輸出任何內容。 –

+0

你爲什麼不比「回答」,@PeterBoughton?鑑於它*是*答案... –

回答

4

總之,正如彼得在他的評論中所說的,基本答案是「你不能」。 ColdFusion沒有類型數組的概念。

有兩種解決方法。首先是在需要時驗證每個數組項的蠻力方法,確保它是您需要的類型。這就是彼得所說的,一般我會做的。

如果做不到這一點,你可以實現它本身包含的ActionItems陣列的ActionItemCollection.cfc,並把它留給ActionItemCollection.cfc只接受ActionItem對象,所以來的時候你render()函數接收其ActionItemCollection的說法,它「知道」中的每一個元素收集絕對是ActionItem

這就是說,這可能是一個非常多的工作,當你可以只是得到render()來檢查元素是否合法,如果不是,則拋出異常。這不是一個完美的解決方案,但是CF正在創造一個不完美的局面,非常公平。

+0

我確實使用了實現Collection組件的解決方案答案是IMO最全面的答案,儘管其他答案也是正確和好的解決方案! – Philipp

+0

查看我的回答瞭解更新 – plalx

4

爲了詳細說明我的評論,以下是您可以創建的可能集合的概要。

我喜歡收集類和ArrayCollection類在這裏是非常可重用的,並允許您使用包裝數組作爲對象。

component ArrayCollection() 
    { 

     public function init() 
     { 
      variables.collection = []; 

      return this; 
     } 

     public any function get(); 

     public function set(required array collection); 

     public function add(required any item); 

     public function remove(); 

    } 

    component ActionItemCollection extends ArrayCollection 
    { 
     public function add(required ActionItem item); 

     public ActionItem function get(); 
    } 


    component otherComponnet{ 

     public string function render(required ActionItemCollection actions) 
     { 

     } 

    } 

在某些情況下我可能會矯枉過正,但是它允許您在數組中的項目類型之前生效!

+0

查看我的回答瞭解更新 – plalx

0

你可以編寫一個函數來檢查數組。這將需要2個參數,你的數組檢查和對象類型,並返回一個布爾結果。該函數將遍歷對象並確定該索引處的值是否爲對象,如果是,則查看它的元數據以確定它是否是您想要的類型。第一次找到一個壞元素時,你設置一個錯誤的返回值,並中止循環。這不是最理想的解決方案,但它可以工作並且是通用的,您可以將它用作任何其他組件的檢查。

而且,只是爲了自己的理智,我肯定會參考一切你所期望的方式:

public model.bean.Foo[] function Read(required model.bean.Foo aBean) {...}

所以該功能需要一個Foo對象作爲參數和返回美孚對象的數組。只要確保你添加了一個映射到你的初始路徑點(在我的情況下是「模型」),這樣CF就知道從哪裏開始尋找它。在應用程序中。CFC,你會加入類似:

this.mappings["/model"] = getDirectoryFromPath(expandPath(".")) & "myProjectDir/model";

+0

雖然它與原始問題無關,有關使用明確參考的評論! – Philipp

3

事實上,ColdFusion的有對數組類型的一些支持驗證(這是不是與類型化的陣列混淆),但它只是似乎工作使用自定義組件,不適用於原始類型。但是,除this blog entry之外,我還沒有發現此功能的其他任何文檔。我們假設有一個SomeObject組件

我們可以這樣寫:

<cffunction name="testArrayTypeValidation"> 
    <cfargument name="someObjects" type="SomeObject[]" required="yes"> 

    <cfdump var="#someObjects#"> 
</cffunction> 

然後撥打我們喜歡的功能:

<cfset testArrayTypeValidation([new SomeObject()])> 

但是,要小心,它會只有數組,在驗證的第一項的類型的意味着以下內容也有效:

<cfset testArrayTypeValidation([new SomeObject(), 'some string'])> 

此外,它似乎不適用於原始類型,因此您不能使用type="string[]"作爲例子,這有點令人難過。

對於原始類型,您將不得不實現自己的具體包裝類,它將確保只包含特定類型的原語並將該類用作參數類型。

相關問題