В AppleScript почему локальные переменные в обработчиках захватывают «с» меченными параметрами?
-
01-10-2019 - |
Вопрос
В 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 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}}
Решение
После игре с ним немного, ответ кажется, что использует with
помеченные параметры не вводят переменные. Вместо этого значения назначаются локальными переменными в порядке, которые они встречаются в обработчике.
Иллюстративные примеры:
on baa of thing with frst and scnd
scnd
frst
return {frst:scnd, scnd:frst}
end baa
on bas of thing with frst and scnd
-- note that eat_frst gets the value of the frst parameter,
-- then gets set to "set"
set eat_frst to "set"
eat_scnd
return {frst:eat_frst, scnd:eat_scnd}
end bas
on qux of thing with frst and scnd
if scnd then
end if
local eat_scnd, eat_others
return {frst:scnd, scnd:eat_scnd}
end qux
on quux of thing with frst and scnd
if frst then
end if
if eat_scnd then
end if
return {frst:frst, scnd:eat_scnd}
end quux
{ baa: (baa of "baa" with frst without scnd), ¬
bas: (bas of "bas" with frst without scnd), ¬
qux: (qux of "qux" with frst without scnd), ¬
quux: (qux of "qux" with frst without scnd) }
Результат:
{ baa:{frst:true, scnd:false}, bas:{frst:"set", scnd:false}, qux:{frst:true, scnd:false}, quux:{frst:true, scnd:false}}