在ColdFusion组件中,我声明了一个这样的函数:
string function render(required Array actions) output=false {
//...
}
因此函数参数只能接受一个数组。但是,我需要确保数组只包含“ActionItem”对象(有一个ActionItem.cfc组件)
ColdFusion中有没有办法输入提示数组内容?在这种情况下,您建议采用什么解决方案?
答案 0 :(得分:4)
简而言之,正如彼得在评论中所说,基本答案是“你做不到”。 ColdFusion没有有类型数组的概念。
有两种解决方法。首先是根据需要验证每个数组项目的蛮力方法,确保它是您需要的类型。这是彼得建议的,通常是我要做的。
如果您未能实现ActionItemCollection.cfc
本身包含ActionItems
数组,并将其留给ActionItemCollection.cfc
仅接受ActionItem
个对象,那么到render()
函数接收其ActionItemCollection
参数,它“知道”集合中的每个元素肯定是ActionItem
。
那就是说,当你可以让render()
检查元素是否合法时,这可能是一项非常多的工作,如果没有,则抛出异常。这不是一个完美的解决方案,但CF正在创造一个不完美的情况,非常公平。
答案 1 :(得分: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)
{
}
}
在某些情况下,我有点矫枉过正,但是它允许你在数组中输入项目的类型!
答案 2 :(得分:3)
实际上,ColdFusion对数组类型验证(不要与类型化数组混淆)有一些支持,但它似乎只适用于自定义组件,< strong>不适用于原始类型。但是除了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[]"
,这有点令人伤心。
对于基本类型,您必须实现自己的具体包装类,它将确保仅包含特定类型的基元并将该类用作参数类型。
答案 3 :(得分:0)
您可以编写一个函数来检查数组。它需要2个参数,你的数组要检查和对象类型,并返回一个布尔结果。该函数将遍历对象并确定该索引处的值是否为对象,如果是,则查看它的元数据以确定它是否是您想要的类型。第一次找到错误的元素时,设置一个错误的返回值,并中止循环。它不是最理想的解决方案,但它可以工作并且通用,您可以将其用作任何其他组件的检查。
另外,为了你自己的理智,我肯定会以你期望的方式引用所有内容:
public model.bean.Foo[] function Read(required model.bean.Foo aBean) {...}
因此该函数需要一个Foo对象作为参数并返回一个Foo对象数组。只需确保在初始路径点添加映射(&#34;模型&#34;在我的情况下),因此CF将知道从哪里开始寻找它。在Application.cfc中,您可以添加如下内容:
this.mappings["/model"] = getDirectoryFromPath(expandPath(".")) & "myProjectDir/model";