2017-08-23 3 views
3

J'ai une liste et je souhaite supprimer certains éléments d'une fonction. Je passe les éléments que je veux supprimer dans cette fonction en tant que structure. Je pensais pouvoir utiliser la fonction ListFilter pour parcourir la liste. Puisque je passe une fonction comme argument dans cette fonction, je me demande maintenant s'il est possible d'accéder à la portée Arguments de mon cffunction depuis la fermeture. Cette fermeture peut-elle accéder à des variables "externes"? Dans quelle mesure doivent-ils résider?Possibilité d'utiliser ListFilter dans un cffunction

<cffunction name="funcA" returntype="string"> 
    <cfargument name="struExcludeCols" type="struct"> 

    <cfset local.strLst = "Listel1,Listel2,Listel3"> 

    <cfscript> 
     local.columnNames = ListFilter( 
      strLst, 
      function(strCol) {    
       return not StructKeyExists(Arguments.struExcludeCols, strCol);  
      } 
     ); 
    </cfscript> 

    <cfreturn local.columnNames> 
</cffunction> 


<cfdump var="#funcA({ "Listel2" = 1 })#"> 
+0

Que voulez-vous dire par 'closure'? –

+0

@DanBracuk La fermeture est la "fonction inline" que je passe à 'ListFilter' comme deuxième argument. –

+0

Il suffit de voir cet enregistrement stackoverflow: https://stackoverflow.com/questions/220658/what-is-the-difference-between-a-closure-and-a-lambda 'Une fermeture [...] peut accéder aux variables non dans sa liste de paramètres ». Cela ne marche pas dans mon cas, donc ce n'est pas une fermeture. ;) Un 'lambda' alors. –

Répondre

2

La fonction en ligne à l'intérieur ListFilter n'a pas accès à la portée Arguments de funcA. Il a accès à this.

Code de travail:

<cffunction name="funcA" returntype="string"> 
    <cfargument name="struExcludeCols" type="struct"> 

    <cfset local.strLst = "Listel1,Listel2,Listel3"> 
    <cfset this.struExcludeCols = Arguments.struExcludeCols> 

    <cfscript> 
     local.columnNames = ListFilter( 
      strLst, 
      function(strCol) {    
       return not StructKeyExists(this.struExcludeCols, strCol);  
      } 
     ); 
    </cfscript> 

    <cfreturn local.columnNames> 
</cffunction> 


<cfdump var="#funcA({ "Listel2" = 1 })#"> 
+0

'this' est la portée privée globale du cfc. Je ne voudrais pas le polluer mais répond à ma question. Je vous remercie! –