В Applescript, если вы объявляете обработчик, используя помеченные «с» параметры, локальные переменные получают значения аргументов, а сами параметры не определены. Например:
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
приводит к сообщению об ошибке, что "scnd" не определен во второй строке bam
. thing
и frst
оба определены, получая аргументы, переданные в вызове bam
. Почему это происходит? Почему scnd
не определено?
Примечание: я знаю, что объявление переменных как "локальных" в обработчике не нужно. Это сделано в примерах для иллюстративных целей.
Вот еще несколько примеров, которые не выдают ошибок, иллюстрирующих, какая переменная получает какое значение. Чтобы различать первый и второй заданные параметры, каждому обработчику вызывается with
первый заданный параметр и without
второй заданный параметр. Обратите внимание, что при использовании синтаксиса given <i>userLabel</i>:<i>userParamName</i>
проблем с захватом значений не возникает.
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)}
Результат:
{ foo:{frst:true, scnd:false},
bar:{frst:true, scnd:false},
baz:{frst:true, scnd:false}}