Почему arrayAppend возвращает true, а listAppend возвращает список? - PullRequest
9 голосов
/ 16 июля 2009

В ColdFusion функция arrayAppend () принимает массив и элемент для добавления. Он изменяет переданный массив и возвращает true в случае успеха.

Функция listAppend (), однако, берет список и добавляемый элемент и возвращает новый список с добавленным элементом. Он не изменяет список, который был передан.

Почему эти функции работают двумя разными способами? Я всегда обращаюсь к документации, чтобы запомнить возвращаемое значение каждого.

Ответы [ 4 ]

10 голосов
/ 16 июля 2009

Это потому, что в ColdFusion нет типа данных "Список".

«Список» - это простая строка с разделителями. По умолчанию он разделен запятыми, но вы можете выбрать разделитель. «ListAppend()» является операцией конкатенации строк, и поэтому возвращает результат своей работы так же, как и «string1 & string2».

Единственное, что "ListAppend()" делает для вас, это: он заботится об обработке разделителя, предотвращая ненужные двойные разделители - то, что "string1 & string2" не может сделать.

Массив является реальным типом данных и (в отличие от строки) может быть изменен на месте. Это то, что делает ArrayAppend().

4 голосов
/ 16 июля 2009

Чтобы понять, почему это происходит, вам нужно немного узнать о том, как работают строки в Java, потому что базовой реализацией списка в ColdFusion является java.lang.String.

<cfset list = "a,b,c"/>
<cfoutput>#list.getClass()#</cfoutput>

В Java строки являются неизменяемыми и не имеют методов для изменения содержимого строки. Если бы вы сделали следующее в Java, вы бы создали новый экземпляр String и присвоили бы его для каждого оператора:

String s = "abc";
s = "def";
s = s.concat("ghi");

Использование метода listAppend () в ColdFusion создает новый экземпляр String под капотом и возвращает его, таким образом, необходимо делать что-то подобное при добавлении значений в список.

<cfset list = "a,b,c"/>
<cfset list = listAppend(list,'d')/>
<cfoutput>#list#</cfoutput>

Однако, когда вы модифицируете массив с помощью arrayAppend (), вы напрямую модифицируете массив, поэтому нет необходимости заново назначать значение себе, как это требуется с listAppend ().

1 голос
/ 18 июля 2009

Также обратите внимание, что, хотя все встроенные функции массива изменяют массив на месте, для пользовательских определенных функций массивы передаются по значению! Это означает, что вы не можете написать UDF, который изменяет массив на месте. (Если вы не заключаете массив в объект, который равен , переданный по ссылке, такой как структура или CFC.)

Результатом этого является то, что если вы пишете свои собственные функции утилит массива, вам часто приходится в конечном итоге вызывать их так:

<cfset MyArray = DoSomethingWithArray(MyArray)>
0 голосов
/ 16 июля 2009

ListAppend - это, по сути, функция обработки строк, которая добавляет элемент в конец списка, а затем возвращает новый список. Чтобы выполнить строковые манипуляции, которые изменяют размер строки, вы не можете просто добавить эти данные в память. Что если следующее место в памяти содержит другие важные данные? Вместо этого система должна выделить блок данных, равный (или больший) размеру новой строки. Этот блок находится в новом месте, поэтому необходимо вернуть ссылку, чтобы у вызывающей стороны был доступ к новым данным.

При использовании arrayAppend размер массива является постоянным и не изменяется, поэтому не нужно создавать новую ссылку.

...