在ColdFusion中,arrayAppend()函数接受一个数组和一个要追加的项。它修改传入的数组,如果成功则返回true。
然而,listAppend()函数接受一个列表和一个要追加的项目,并返回一个附加项目的新列表。它不会修改传入的列表。
为什么这些功能以两种不同的方式运作?我总是转向文档来记住每个文档的返回值。
答案 0 :(得分:10)
这是因为ColdFusion中没有“List”数据类型。
“List”是一个分隔的字符串,就像那样简单。默认情况下它以逗号分隔,但您可以选择分隔符。 “ListAppend()
”是字符串连接操作,因此它返回其工作结果,就像“string1 & string2
”那样。
“ListAppend()
”唯一能给你的是:它负责分隔符处理,防止不必要的双分隔符 - “string1 & string2
”无法做到的事情。
数组是真实数据类型,(与字符串形成对比)可以就地修改。这就是ArrayAppend()
的作用。
答案 1 :(得分:4)
要理解为什么会发生这种情况,你需要了解一下Strings如何在Java中工作,因为ColdFusion中列表的底层实现是java.lang.String。
<cfset list = "a,b,c"/>
<cfoutput>#list.getClass()#</cfoutput>
在Java中,字符串是不可变的,没有方法来修改String的内容。如果您在Java中执行了以下操作,那么您将创建一个String的新实例,并为每个语句将其分配给s:
String s = "abc";
s = "def";
s = s.concat("ghi");
在ColdFusion中使用listAppend()方法是在底层创建一个String的新实例并返回它,因此每当您将值附加到列表时都需要执行类似的操作。
<cfset list = "a,b,c"/>
<cfset list = listAppend(list,'d')/>
<cfoutput>#list#</cfoutput>
但是,当您使用arrayAppend()修改数组时,您将直接修改数组,因此无需再次将值重新分配给自身,就像您需要使用listAppend()一样。
答案 2 :(得分:1)
另请注意,即使所有内置数组函数都就地修改了数组,对于用户定义的函数,数组也会按值传递!这意味着您无法编写一个就地修改数组的UDF。 (除非您将数组包装在 通过引用传递的对象中,例如结构或CFC。)
这样做的结果是,如果你编写自己的数组实用程序函数,你通常最终会像这样调用它们:
<cfset MyArray = DoSomethingWithArray(MyArray)>
答案 3 :(得分:0)
ListAppend本质上是一个字符串操作函数,它将元素追加到列表的末尾,然后返回新列表。为了执行更改字符串大小的字符串操作,您不能只将该数据附加到内存中。如果内存中的下一个位置包含其他重要数据怎么办?相反,系统必须分配与新字符串大小相等(或更大)的数据块。此块位于新位置,因此需要返回引用,以便调用者可以访问新数据。
使用arrayAppend,数组的大小是常量且不会改变,因此不需要创建新的引用。