Coldfusion可以在函数参数中定义数组的类型吗?

时间:2013-07-16 12:20:12

标签: coldfusion

在ColdFusion组件中,我声明了一个这样的函数:

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

因此函数参数只能接受一个数组。但是,我需要确保数组只包含“ActionItem”对象(有一个ActionItem.cfc组件)

ColdFusion中有没有办法输入提示数组内容?在这种情况下,您建议采用什么解决方案?

4 个答案:

答案 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";