В Applescript, если вы объявляете обработчик, используя параметры с меткой «with», локальные переменные получают значения аргументов, а сами параметры не определены. Например:
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 userLabel:userParamName
не вызывает проблем с захватом значений.
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}}