Dans Applescript, si vous déclarez un gestionnaire utilisant des paramètres étiquetés "with", les variables locales obtiennent les valeurs des arguments et les paramètres eux-mêmes ne sont pas définis. Par exemple:Dans Applescript, pourquoi les variables locales dans les gestionnaires capturent "avec" des paramètres étiquetés?
on bam of thing with frst and scnd
local eat_frst
return {thing: thing, frst:frst, scnd:scnd} -- this line throws an error
end bam
bam of "bug-AWWK!" with frst without scnd
résultats dans un message d'erreur « CSDN » ne soit pas défini dans la deuxième ligne de bam
. thing
et frst
sont tous deux définis, obtenant les arguments transmis dans l'appel à bam
. Pourquoi cela arrive-t-il? Pourquoi scnd
est-il indéfini?
Remarque: Je sais que déclarer des variables comme "locales" dans un gestionnaire est inutile. C'est fait dans les exemples à des fins d'illustration.
Voici d'autres exemples qui ne génèrent pas d'erreurs, illustrant quelle variable obtient quelle valeur. Pour distinguer les premier et deuxième paramètres donnés, chaque gestionnaire est appelé with
le premier paramètre donné et without
le second paramètre donné. Notez que l'utilisation de la syntaxe given userLabel:userParamName
n'a aucun problème avec la capture de valeur.
on foo of thing given frst:frst_with, scnd:scnd_with
local eat_nothing
return {frst:frst_with, scnd:scnd_with}
end foo
on bar of thing with frst and scnd
local eat_frst
return {frst:eat_frst, scnd:scnd}
end bar
on baz of thing with frst and scnd
eat_frst
local eat_scnd, eat_others
return {frst:eat_frst, scnd:eat_scnd}
end baz
{foo:(foo of "foo" with frst without scnd), ¬
bar:(bar of "bar" with frst without scnd), ¬
baz:(baz of "baz" with frst without scnd)}
Résultat:
{ foo:{frst:true, scnd:false}, bar:{frst:true, scnd:false}, baz:{frst:true, scnd:false}}