4

在 ColdFusion 组件中,我声明了一个函数,如下所示:

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

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

ColdFusion 中有没有办法对数组内容进行类型提示?在这种情况下,您建议什么解决方案?

4

4 回答 4

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) 
        {

        }

    }

在某些情况下,这有点矫枉过正,但它允许您预先确定数组中的项目类型!

于 2013-07-16T12:54:54.400 回答
4

简而言之,正如彼得在评论中所说,基本答案是“你不能”。ColdFusion 没有类型数组的概念。

有两种解决方法。首先,根据需要验证每个数组项的蛮力方法,确保它是您需要的类型。这是彼得建议的,也是我通常会做的。

如果你不能实现一个它本身ActionItemCollection.cfc包含一个.ActionItemsActionItemCollection.cfcActionItemrender()ActionItemCollectionActionItem

也就是说,当您可以render()检查元素是否合法时,这可能是一项非常多的工作,如果不是,则抛出异常。这不是一个完美的解决方案,但 CF 正在创造一个不完美的情况,这很公平。

于 2013-07-16T12:49:19.317 回答
3

实际上,ColdFusion对数组类型验证有一些支持(不要与类型化数组混淆),但它似乎只适用于自定义组件,不适用于原始类型但是,除了这个 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[]"例如,这有点可悲。

对于原始类型,您必须实现自己的具体包装类,该类将确保仅包含某种类型的原始类型并将该类用作参数类型。

于 2013-09-11T15:40:24.337 回答
0

您可以编写一个函数来检查数组。它需要 2 个参数,要检查的数组和对象类型,并返回一个布尔结果。该函数将遍历对象并确定该索引处的值是否是一个对象,如果是,则查看它的元数据以确定它是否是您想要的类型。当你第一次发现一个坏元素时,你设置一个错误的返回值,并中止循环。这不是最理想的解决方案,但它可以工作并且是通用的,您可以将其用作任何其他组件的检查。

另外,为了您自己的理智,我肯定会按照您期望的方式引用所有内容:

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

因此该函数需要一个 Foo 对象作为参数并返回一个 Foo 对象数组。只需确保将映射添加到初始路径点(在我的情况下为“模型”),以便 CF 知道从哪里开始寻找它。在 Application.cfc 中,您将添加如下内容:

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

于 2013-07-16T13:23:01.977 回答