В AppleScript почему локальные переменные в обработчиках захватывают «с» меченными параметрами?

StackOverflow https://stackoverflow.com/questions/2710605

Вопрос

В 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}}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top