Почему arrayAppend возвращает true, и listAppend возвращают список?

Вычислите результаты с удваивается. У них есть 15 значащих цифр. Ваше требование имеет трудную верхнюю границу на c 10 <глоток> 8   —   это может иметь самое большее 8 цифр. Следовательно, результат будет точен, если это будет в диапазоне, и это не переполнится иначе.

9
задан Henry 16 July 2009 в 18:30
поделиться

4 ответа

Это связано с тем, что в ColdFusion нет типа данных «Список».

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

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

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

10
ответ дан 4 December 2019 в 13:49
поделиться

To understand why this happens you need to know a little bit about how Strings work in Java because the underlying implementation of a list in ColdFusion is a java.lang.String.

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

In Java, Strings are immutable and have no methods to modify the contents of a String. If you did the following in Java, you would be creating a new instance of a String and assigning it to s for each statement:

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

Using the listAppend() method in ColdFusion is creating a new instance of a String under the hood and returning it, thus the need to do something like this whenever you append values to a list.

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

However, when you modify an array with arrayAppend(), you are directly modifying the array, thus there is no need to reassign the value to itself again like you need to with listAppend().

4
ответ дан 4 December 2019 в 13:49
поделиться

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

С arrayAppend размер массива постоянный и не изменяется, поэтому новая ссылка не требуется будет создан.

0
ответ дан 4 December 2019 в 13:49
поделиться

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

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

<cfset MyArray = DoSomethingWithArray(MyArray)>
1
ответ дан 4 December 2019 в 13:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: