9
votes

Pourquoi ArrayAppend Retourne-t-il True et Readappend retourner la liste?

Dans ColdFusion, la fonction ArrayAppend () prend une matrice et un article à ajouter. Il modifie la matrice qui a été transmise et retourne vrai en cas de succès.

La fonction ListAppend () prend toutefois une liste et un élément à ajouter et renvoie une nouvelle liste avec l'article ajouté. Il ne modifie pas la liste qui a été transmise.

Pourquoi ces fonctions fonctionnent-elles de deux manières différentes? Je me tournais toujours vers la documentation pour me souvenir de la valeur de retour de chacun.


0 commentaires

4 Réponses :


10
votes

Ceci est parce qu'il n'y a pas de "liste" type de données dans ColdFusion.

une "liste" est une chaîne délimitée, aussi simple que cela. C'est délimité par des virgules par défaut, mais vous pouvez choisir le délimiteur. " listAppendend () " est une opération de concaténation à chaîne et, en tant que tel, il renvoie le résultat de son travail, comme " string1 & string2 ". "

la seule chose que " listAppend () " fait pour vous: il s'occupe de la manipulation de délimiter, empêchant les deux doubles délimiteurs inutiles - quelque chose que " string1 & string2 "Ne peut pas faire.

Un tableau est un vrai type de données et (contrairement à une chaîne) peut être modifié en place. C'est ce que arrayappend () fait.


0 commentaires

0
votes

ListAppend est essentiellement une fonction de manipulation de chaîne qui appelle l'élément à la fin de la liste, puis renvoie la nouvelle liste. Pour effectuer des manipulations de chaîne qui modifient la taille d'une chaîne, vous ne pouvez pas simplement ajouter ces données en mémoire. Et si le prochain emplacement en mémoire contient d'autres données importantes? Au lieu de cela, le système doit attribuer un bloc de données égal (ou plus grand) à la taille de la nouvelle chaîne. Ce bloc est dans un nouvel emplacement, la référence doit donc être renvoyée afin que l'appelant ait accès aux nouvelles données.

avec arrayappend, la taille de la matrice est constante et ne change pas, aucune nouvelle référence ne doit être créée.


3 commentaires

pas tout à fait correct. La taille de la matrice n'est pas toujours constante dans CF 'car elle utilise une arrayliste, qui redimensionnera de manière dynamique. Mais je sais ce que tu veux dire .. :)


En fait, la matrice de Coldfusion utilise Java.Util.vector, mais vous avez raison, la capacité sera doublée de manière dynamique lorsque vous ajoutez de nouveaux articles.


Techniquement, il double uniquement quand il doit se développer (c'est-à-dire le nombre d'articles est supérieur à la capacité). Bien que cela soit vraiment déterminé par les paramètres sous-jacents utilisés. CF semble utiliser les paramètres par défaut des vecteurs.



4
votes

Comprendre pourquoi cela se produit, vous devez connaître un peu à la manière dont les chaînes fonctionnent en Java, car la mise en œuvre sous-jacente d'une liste dans ColdFusion est une java.lang.string. XXX

Java, les chaînes sont immuables et n'ont aucune méthode pour modifier le contenu d'une chaîne. Si vous avez fait ce qui suit en Java, vous créez une nouvelle instance d'une chaîne et l'attribuez à S pour chaque instruction: xxx

à l'aide de la méthode ListAppend () dans Coldfusion Création d'une nouvelle instance d'une chaîne sous la hotte et le renvoie, donc la nécessité de faire quelque chose comme celui-ci chaque fois que vous appendez des valeurs à une liste. xxx

Toutefois, lorsque vous modifiez un tableau avec ArrayAppend (), vous modifiez directement la matrice, il n'est donc pas nécessaire de réaffecter à nouveau la valeur à nouveau que vous devez avec listAppend ().


1 commentaires

Si vous regardez un peu de retour, vous verrez que Java n'a rien à voir avec le comportement de ListaPendend (). ListApendend () s'est comporté comme ça depuis le début, alors que Java fait partie du jeu que depuis CF6.



1
votes

Notez également que, même si toutes les fonctions de tableau intégrées modifient la matrice en place, pour Utilisateurs -DEFINÉE, les tableaux sont transmis par la valeur! Cela signifie que vous ne peut pas écrire un UDF qui modifie un tableau en place. (Sauf si vous enveloppez la matrice dans un objet que est transmis transmis par référence, telle qu'une structure ou un CFC.)

Le résultat est que si vous écrivez vos propres fonctions utilitaires Array, vous. souvent doivent finir par les appeler comme ceci: xxx


0 commentaires