2013-10-17 1 views
0

J'essaie d'apprendre des captures dans Lasso 9, mais j'ai du mal à comprendre comment accéder à la variable locale #1 à partir d'un conditionnel qui est à l'intérieur d'une capture array->forEach. Peut-être que mon approche est tout faux. Y a-t-il une référence à la capture parentale que je dois utiliser? Voici le code de travail:Comment accéder # 1 à l'intérieur conditionnel array-> forEach

define paramstovars() => { 

    local(p = web_request->params) 

    #p->foreach => { 
     local(i = #1) 
     if(#i->type == 'pair') => { 
      var(#i->first->asstring = #i->second->asstring) 
     } 
    } 

} 

Voici le code que je suis en train de se mettre au travail sans compter sur une définition variable locale redondante:

define paramstovars() => { 

    local(p = web_request->params) 

    #p->foreach => { 
     if(#1->type == 'pair') => { 
      var(#1->first->asstring = #1->second->asstring) 
     } 
    } 

} 

Dans ce deuxième exemple, je reçois une erreur qui La position était hors de portée: 1 max est 0 (code d'erreur -1) sur la ligne appelant var().

Problèmes de sécurité évidents avec cette méthode personnalisée mise à part, quel est le moyen le plus efficace de rendre le n ° 1 disponible dans les conditions imbriquées?

Merci pour votre temps et votre aide.

Répondre

1

# 1 est remplacé dans chaque capture - donc oui, vous devrez l'assigner à un autre local pour l'utiliser dans des captures plus profondes. Si vous avez besoin de travailler avec le nouveau locale essayez d'utiliser les expressions de requête à la place:

with i in web_request->params do { 
    if(#i->type == 'pair') => { 
     var(#i->first->asstring = #i->second->asstring) 
    } 
} 

Aussi, je ne recommanderais pas les variables paramètres de cette façon - il posséder un risque de sécurité. Il vaudrait mieux stocker les paramètres dans une seule variable, puis éventuellement en définir des variables spécifiques. Il y a un ensemble de balises qui fait quelque chose de similaire ici: getparam/postparam

0

D'après mon expérience, le n ° 1 est consommé lorsqu'il est appelé pour la première fois. Au moins, je n'ai jamais été capable de l'appeler deux fois dans la même capture.

Si j'ai besoin de la valeur plus d'une fois, je fais une première locale. Comme dans votre exemple 1.

+0

Oublier tout ce que je l'ai déjà écrit! Voir ma prochaine réponse – jolle

0

Quelques expériences plus tard.

Vous pouvez appeler # 1 plusieurs fois, contrairement à ce que j'ai écrit, mais ce qui déclenche votre effort, c'est que vous avez une capture à l'intérieur de la capture (le conditionnel). La seconde capture aura ses propres paramètres d'entrée.

est ici un travail, testé par exemple pour faire ce que vous voulez faire:

local(
    myarray = array(1, 2 = 'two', 3 = 'four', 4), 
    mypairs = map 
) 

#myarray -> foreach => { 
    if(#1-> isa(::pair)) => { 
     #mypairs -> insert(#1 -> first -> asstring = #1 -> second -> asstring) 
    }(#1) 
} 
#my pairs 

Le résultat sera la carte (2 = deux, 3 = quatre)

L'astuce est l'envoi du foreach param à la capture conditionnelle: `{some code} (# 1)

Maintenant, avec tout ce qui s'est passé. Je vous recommande de jeter un oeil à la dernière addition de Ke Carltons à tagswap. Il va résoudre le même problème bien mieux que la création d'un groupe de vars dynamiques que vous essayez de le faire:

www.lassosoft.com/tagswap/detail/web_request_params

+0

Bugger, Ke me frappe dessus – jolle

Questions connexes