裏面ColdFusion組件我宣佈這樣的函數:ColdFusion可以在函數參數中定義數組的類型嗎?
string function render(required Array actions) output=false {
//...
}
因此函數參數只能接受一個數組。然而,我需要確保該數組只包含「ActionItem」對象(有一個ActionItem.cfc組件)
有沒有在ColdFusion中鍵入提示數組內容的方法?你在這種情況下建議什麼解決方案?
裏面ColdFusion組件我宣佈這樣的函數:ColdFusion可以在函數參數中定義數組的類型嗎?
string function render(required Array actions) output=false {
//...
}
因此函數參數只能接受一個數組。然而,我需要確保該數組只包含「ActionItem」對象(有一個ActionItem.cfc組件)
有沒有在ColdFusion中鍵入提示數組內容的方法?你在這種情況下建議什麼解決方案?
總之,正如彼得在他的評論中所說的,基本答案是「你不能」。 ColdFusion沒有類型數組的概念。
有兩種解決方法。首先是在需要時驗證每個數組項的蠻力方法,確保它是您需要的類型。這就是彼得所說的,一般我會做的。
如果做不到這一點,你可以實現它本身包含的ActionItems
陣列的ActionItemCollection.cfc
,並把它留給ActionItemCollection.cfc
只接受ActionItem
對象,所以來的時候你render()
函數接收其ActionItemCollection
的說法,它「知道」中的每一個元素收集絕對是ActionItem
。
這就是說,這可能是一個非常多的工作,當你可以只是得到render()
來檢查元素是否合法,如果不是,則拋出異常。這不是一個完美的解決方案,但是CF正在創造一個不完美的局面,非常公平。
爲了詳細說明我的評論,以下是您可以創建的可能集合的概要。
我喜歡收集類和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)
{
}
}
在某些情況下我可能會矯枉過正,但是它允許您在數組中的項目類型之前生效!
查看我的回答瞭解更新 – plalx
你可以編寫一個函數來檢查數組。這將需要2個參數,你的數組檢查和對象類型,並返回一個布爾結果。該函數將遍歷對象並確定該索引處的值是否爲對象,如果是,則查看它的元數據以確定它是否是您想要的類型。第一次找到一個壞元素時,你設置一個錯誤的返回值,並中止循環。這不是最理想的解決方案,但它可以工作並且是通用的,您可以將它用作任何其他組件的檢查。
而且,只是爲了自己的理智,我肯定會參考一切你所期望的方式:
public model.bean.Foo[] function Read(required model.bean.Foo aBean) {...}
所以該功能需要一個Foo對象作爲參數和返回美孚對象的數組。只要確保你添加了一個映射到你的初始路徑點(在我的情況下是「模型」),這樣CF就知道從哪裏開始尋找它。在應用程序中。CFC,你會加入類似:
this.mappings["/model"] = getDirectoryFromPath(expandPath(".")) & "myProjectDir/model";
雖然它與原始問題無關,有關使用明確參考的評論! – Philipp
事實上,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[]"
作爲例子,這有點令人難過。
對於原始類型,您將不得不實現自己的具體包裝類,它將確保只包含特定類型的原語並將該類用作參數類型。
CFML沒有鍵入數組。如果您真的需要確認這一點,您需要在[isInstanceOf](http://cfdocs.org/isInstanceOf)循環內執行此操作(但您可能實際上並不需要)。 –
p.s.腳本中不需要'output = false' - 除非明確使用writeOutput/writeDump/etc,否則不會輸出任何內容。 –
你爲什麼不比「回答」,@PeterBoughton?鑑於它*是*答案... –