Об обработчиках

Когда разработчики сценария хотят к фактору и снова используют свой код, они могут повернуться к обработчикам. Обработчик является набором операторов, которые могут быть вызваны по имени. Обработчики также известны как функции, подпрограммы или методы.

В этой главе описываются, как работать с обработчиками в следующих разделах:

Для подробной справочной информации посмотрите Ссылку Обработчика.

Основы обработчика

Обработчик является набором операторов, которые могут быть вызваны по имени. Обработчики полезны в сценариях, выполняющих то же действие больше чем в одном месте. Можно упаковать операторы, выполняющие определенную задачу как обработчик, дающие ему описательное имя и вызывающие его отовсюду в сценарии. Это делает сценарий короче и проще поддержать.

Сценарий может содержать один или несколько обработчиков. Однако Вы не можете вложить определение обработчика в другом обработчике (несмотря на то, что объект сценария, определенный в обработчике, может содержать другие обработчики).

Определение для обработчика указывает параметры, которые оно использует, если таковые имеются. Это не указывает класс для своих параметров. Однако большинство обработчиков ожидает, что каждый параметр будет определенного класса, таким образом, будет полезно добавить комментарий, перечисляющий ожидаемые типы классов.

При вызове обработчика необходимо перечислить его параметры согласно тому, как они указаны в его определении. Обработчики, возможно, маркировали, позиционный, или чередовали параметры, описал в последующих разделах.

Определение обработчика может содержать объявления переменной и операторы. Это может использовать a return оператор (описанный подробно в “return”) возвратить значение и выйти из обработчика.

Вызов к обработчику должен включать все параметры, указанные в определение обработчика. Нет никакого способа указать дополнительные параметры.

Следующие разделы предоставляют дополнительную информацию о работе с обработчиками:

Определение простого обработчика

Следующее является определением для простого обработчика, берущего любое значение параметра, которое может быть выведено на экран как текст (по-видимому одно представление даты) и выводит на экран его в диалоговом окне. Имя обработчика rock; его параметр around the clock, где around метка параметра и clock название параметра (the заполнитель AppleScript для удобочитаемости):

on rock around the clock
    display dialog (clock as text)
end rock

Этот обработчик позволяет подобный английскому языку оператор вызова:

rock around the current date -- call handler to display current date

Обработчик не может иметь никаких параметров. Чтобы указать, что обработчик не имеет никаких параметров, Вы включаете пару пустых круглых скобок после имени обработчика и в определении обработчика и в вызове обработчика. Например, следующий helloWorld сценарий не имеет никаких параметров.

on helloWorld()
    display dialog "Hello World"
end
 
helloWorld() -- Call the handler

Обработчики с маркированными параметрами

Для определения обработчика с помощью маркированных параметров Вы перечисляете метки для использования при вызове обработчика и операторов, которые будут выполняться, когда его вызывают. (Синтаксис показан в Синтаксисе Обработчика (Маркированные Параметры).)

Обработчики с маркированными параметрами могут также иметь прямой параметр. За исключением прямого параметра, который должен непосредственно следовать за именем обработчика, маркированные параметры могут появиться в любом порядке с метками из определения обработчика, идентифицирующего значения параметров. Это включает параметры, перечисленные в given, with, и without пункты (которых может быть любое число).

findNumbers обработчик в следующем примере использует специальную метку given определить параметр с помощью метки given rounding.

to findNumbers of numberList above minLimit given rounding:roundBoolean
        set resultList to {}
        repeat with i from 1 to (count items of numberList)
            set x to item i of numberList
            if roundBoolean then -- round the number
                -- Use copy so original list isn’t modified.
                copy (round x) to x
            end if
            if x > minLimit then
                set end of resultList to x
            end if
        end repeat
        return resultList
end findNumbers

Следующие операторы показывают, как вызвать findNumbers путем передачи предопределенного list переменная:

set myList to {2, 5, 19.75, 99, 1}
findNumbers of myList above 19 given rounding:true
    --result: {20, 99}
findNumbers of myList above 19 given rounding:false
    --result: {19.75, 99}

Можно также указать значение rounding параметр при помощи a with или without пункт для указания true или false. (Фактически при компиляции предыдущих примеров AppleScript автоматически преобразовывает given rounding:true к with rounding и given rounding:false к without rounding.) Эти примеры передают a list возразите непосредственно, вместо того, чтобы использовать a list переменная как в предыдущем случае:

findNumbers of {5.1, 20.1, 20.5, 33} above 20 with rounding
    --result: {33}
 
findNumbers of {5.1, 20.1, 20.5, 33.7} above 20 without rounding
    --result: {20.1, 20.5, 33.7}

Вот другой обработчик, использующий метки параметра:

to check for yourNumber from startRange thru endRange
    if startRange ≤ yourNumber and yourNumber ≤ endRange then
        display dialog "Congratulations! Your number is included."
    end if
end check

Следующее утверждение вызывает обработчик, заставляя его вывести на экран "Congratulations!" сообщение

check for 8 from 7 thru 10 -- call the handler

Обработчики с позиционными параметрами

Определение для обработчика с позиционными параметрами показывает порядок, в котором можно перечислить параметры при вызове обработчика и операторов, которые будут выполняться, когда вызывают обработчик. Определение должно включать круглые скобки, даже если оно не включает параметров. Синтаксис показан в Синтаксисе Обработчика (Позиционные Параметры).

В следующем примере, minimumValue подпрограмма возвращает меньшие из двух значений:

on minimumValue(x, y)
    if x < y then
        return x
    else
        return y
    end if
end minimumValue
 
-- To call minimumValue:
minimumValue(5, 105) --result: 5

Первая строка minimumValue обработчик указывает параметры обработчика. Для вызова обработчика с позиционными параметрами, Вы перечисляете параметры в том же порядке, как они указаны в определении обработчика.

Если вызов обработчика является частью выражения, AppleScript использует значение, возвращенное обработчиком для оценки выражения. Например, для оценки следующего выражения AppleScript сначала вызывает minimumValue, тогда оценивает остальную часть выражения.

minimumValue(5, 105) + 50 --result: 55

Обработчики с шаблонными позиционными параметрами

Можно создать обработчик, позиционные параметры которого определяют образец для соответствия при вызове обработчика. Например, следующий обработчик берет единственный параметр, образец которого состоит из двух элементов в списке:

on displayPoint({x, y})
    display dialog ("x = " & x & ", y = " & y)
end displayPoint
 
-- Calling the handler:
set testPoint to {3, 8}
displayPoint(testPoint)

Образец параметра может быть намного более сложным, чем единственный список. Обработчик в следующем примере берет два числа и запись, свойства которой включают список границ. Обработчик выводит на экран диалоговое окно, суммирующее часть переданной информации.

on hello(a, b, {length:l, bounds:{x, y, w, h}, name:n})
    set q to a + b
 
    set response to "Hello " & n & ", you  are " & l & ¬
        " inches tall and occupy position (" & x &  ", " & y & ")."
 
    display dialog response
 
end hello
 
set thing to {bounds:{1, 2, 4, 5}, name:"George", length:72}
hello (2, 3, thing)
--result: A dialog displaying “Hello George, you are 72 inches  tall
--          and occupy position (1,2).”

Свойства записи, переданной обработчику с шаблонными параметрами, не должны быть даны в том же порядке, в котором им дают в определении обработчика, пока присутствуют все свойства, требуемые соответствовать образцу.

Следующий вызов к minimumValue использует значение от вызова обработчика до maximumValue как его второй параметр. maximumValue обработчик (не показанный) возвращает большие из двух переданных числовых значений.

minimumValue(20, maximumValue(1, 313)) --result: 20

Обработчики с чередованными параметрами

Обработчик с чередованными параметрами является особым случаем одного с позиционными параметрами. Определение показывает порядок, в котором можно перечислить параметры при вызове обработчика и операторов, которые будут выполняться, когда обработчик вызывают, но имя обработчика разломано на кусочки и чередовано с параметрами, которые могут упростить читать. Обработчики с чередованными параметрами могут использоваться в любом сценарии, но особенно полезны с соединенными мостом методами Objective C, так как они естественно напоминают синтаксис Objective C. Синтаксис показан в Синтаксисе Обработчика (Чередованные Параметры).

Обработчик с чередованными параметрами может иметь только один параметр, как в этом примере:

on areaOfCircleWithRadius:radius
    return radius ^ 2 * pi
end areaOfCircleWithRadius:

Или больше чем один, как в этом примере:

on areaOfRectangleWithWidth:w height:h
    return w * h
end areaOfRectangleWithWidth:height:

Для вызова обработчика с чередованными параметрами перечислите параметры в том же порядке, как они указаны в определении обработчика. Несмотря на подобие маркированным параметрам, параметры не могут быть переупорядочены. Кроме того, вызов должен быть явно отправлен в объект, даже если целевой объект является значением по умолчанию, it. Например:

its foo:5 bar:105 --this works
tell it to foo:5 bar:105 --as does this
foo:5 bar:105 --syntax error.

Рекурсивные обработчики

Рекурсивный обработчик является обработчиком, вызывающим себя. Например, этот рекурсивный обработчик генерирует факториал. (Факториал числа является продуктом всех положительных целых чисел от 1 до того числа. Например, 4 факториала равны 1 * 2 * 3 * 4, или 24. Факториал 0 равняется 1.)

on factorial(x)
    if x > 0 then
        return x * factorial(x - 1)
    else
        return 1
    end if
end factorial
 
-- To call factorial:
factorial(10)   --result: 3628800

В примере выше, обработчик factorial вызывается один раз, передавая значение 10. Обработчик тогда вызывает себя рекурсивно со значением x - 1, или 9. Каждый раз, когда обработчик вызывает себя, он выполняет другой рекурсивный вызов до значения x 0. Когда x равно 0, AppleScript пропускает к else пункт и концы, выполняющие все частично выполняемые обработчики, включая оригинал factorial вызвать.

При вызове рекурсивного обработчика AppleScript отслеживает переменные и незаконченные операторы в оригинале (частично выполняемый) обработчик, пока не завершился рекурсивный обработчик. Поскольку каждый вызов использует некоторую память, максимальное количество незаконченных обработчиков ограничивается доступной памятью. В результате рекурсивный обработчик может генерировать ошибку перед завершенными рекурсивными вызовами.

Кроме того, рекурсивный обработчик может не быть наиболее эффективным решением проблемы. Например, факториальный обработчик, показанный выше, может быть переписан для использования a repeat оператор вместо рекурсивного вызова, как показано в примере в repeat with loopVariable (from startValue to stopValue).

Ошибки в обработчиках

Как с любыми операторами AppleScript, которые могут встретиться с ошибкой, можно использовать a try оператор для контакта с возможными ошибками в обработчике. A try оператор включает два набора операторов: один, чтобы быть выполненным в общем случае, и секунда, которая будет выполняться, только если происходит ошибка.

При помощи один или больше try операторы с обработчиком, можно объединить преимущества повторного использования и обработки ошибок в одном пакете. Для подробного примера, демонстрирующего этот подход, посмотрите Работу с Ошибками.

Передача ссылкой по сравнению с передачей значением

В обработчике каждый параметр походит на переменную, обеспечивая доступ к переданной информации. AppleScript передает все параметры ссылкой, что означает, что переданная переменная совместно используется обработчиком и вызывающей стороной, как будто обработчик создал переменную с помощью set команда. Однако важно помнить вопрос, поднятый в Использовании копии и установить Команды: только непостоянные объекты могут фактически быть изменены.

В результате тип класса параметра определяет, передается ли информация эффективно значением или ссылкой:

  • Для непостоянных объектов (те, класс которых date, list, record, или script), информация передается ссылкой:

    Если обработчик изменяет значение параметра этого типа, исходный объект изменяется.

  • Для всех других типов классов информация эффективно передается значением:

    Несмотря на то, что AppleScript передает ссылку на исходный объект, тот объект не может быть изменен. Если обработчик присваивает новое значение параметру этого типа, исходный объект неизменен.

Если Вы хотите передать ссылкой с типом класса кроме date, list, record, или script, можно передать a reference объект, относящийся к рассматриваемому объекту. Несмотря на то, что обработчик будет иметь доступ только к копии reference объект, указанный объект будет тем же. Изменения в указанном объекте в обработчике изменят исходный объект, несмотря на то, что изменения в reference сам объект не будет.

Призыв Обработчиков сказать Оператор

Вызывать обработчик из a tell оператор, необходимо использовать зарезервированные слова of me или my указать, что обработчик является частью сценария и не команды, которая должна быть отправлена в цель tell оператор.

Например, следующий сценарий вызывает minimumValue обработчик определяется в Обработчиках с Позиционными Параметрами из a tell оператор. Если этот вызов не включал слова of me, это вызвало бы ошибку, потому что AppleScript отправит minimumValue команда к TextEdit, не понимающему то сообщение.

tell front document of application "TextEdit"
    minimumValue(12, 400) of me
    set paragraph 1 to result as text
end tell
--result: The handler call is successful.

Вместо того, чтобы использовать слова of me, Вы могли вставить слово my перед вызовом обработчика:

my minimumValue(12, 400)

Обработчики в приложениях сценария

Приложение сценария является приложением, чье только функционируют, должен выполнить сценарий, связанный с ним. Приложения сценария содержат обработчики, позволяющие им реагировать на команды. Например, много приложений сценария могут ответить на run команда и open команда. Приложение сценария получает a run команда каждый раз, когда это запускается и open команда каждый раз, когда другой значок отбрасывается на его значке в Средстве поиска. Это может также содержать другие обработчики для ответа на команды такой как quit или print.

При сохранении сценария в Редакторе сценариев можно создать приложение сценария путем выбора Application или Application Bundle от Параметров формата файлов. Сохранение как Приложение приводит к простому формату, который совместим с Mac OS 9. Сохранение как Комплект приложений приводит к приложению, использующему современный формат пакета с его указанной структурой каталогов, поддерживающейся назад к OS X v10.3.

При создавании приложения сценария можно также указать, должна ли экранная заставка появиться перед выполнением приложения ее сценарий. Независимо от того, что Вы пишете в области Description окна сценария в Редакторе сценариев, выведен на экран в экранной заставке. Можно также указать в Редакторе сценариев, должно ли приложение сценария остаться открытым после выполнения. Значение по умолчанию для сценария для выхода сразу после того, как это будет выполнено.

Можно запустить приложение сценария от Средства поиска во многом как любое другое приложение. Если это имеет экранную заставку, пользователь должен щелкнуть по Кнопке запуска или нажать клавишу Return, прежде чем фактически будет работать сценарий.

Рассмотрите следующий простой сценарий

tell application "Finder"
    close front window
end tell

Что делает этот сценарий, поскольку приложение сценария зависит от того, что Вы указываете при сохранении его. Если Вы не укажете экранную заставку или скажете ей оставаться открытой, то она автоматически выполнится один раз, закрывая переднее окно Finder, и затем выйдет.

Если приложение сценария изменяет значение свойства, измененное значение сохраняется через запуски приложения. Для соответствующей информации посмотрите Объем Переменных и Свойств.

Для получения информации о некоторых общих обработчиках приложения сценария посмотрите следующие разделы:

Посмотрите Ссылку Обработчика для получения информации о синтаксисе.

выполненные Обработчики

Когда Вы выполняете сценарий или запускаете приложение сценария, run обработчик вызывается. Сценарий run обработчик определяется одним из двух способов:

  • Как неявное run обработчик, состоящий из всех операторов, объявленных вне любого обработчика или вложенных script объект в сценарии.

    Объявления для свойств и global переменные не считают операторами в этом контексте — т.е. они не считаются частью неявного run обработчик.

  • Как явное run обработчик, в котором включают on run и end операторы, подобные другим обработчикам.

Наличие и неявное и явное run обработчик не позволяется и вызывает синтаксическую ошибку во время компиляции. Если сценарий не имеет никакого обработчика выполнения (например, сценарий, служащий библиотекой обработчиков, как описано в Сохранении и Загрузке Библиотек Обработчиков), выполнение сценария ничего не делает. Однако отправляя ему явное run команда вызывает ошибку.

Следующий сценарий демонстрирует неявное run обработчик. Сценарий состоит из оператора, вызывающего sayHello обработчик и определение для самого обработчика:

sayHello()
 
on sayHello()
    display dialog "Hello"
end sayHello

Неявное run обработчик для этого сценария состоит из оператора sayHello(), который является единственным оператором вне обработчика. Если Вы сохраняете этот сценарий как приложение сценария и затем запускаете приложение, сценарий получает a run команда, заставляющая его выполнять один оператор в неявном run обработчик.

Можно переписать предыдущий сценарий для обеспечения того же самого поведения явным run обработчик:

on run
    sayHello()
end run
 
on sayHello()
    display dialog "Hello"
end sayHello

Сохраняется ли сценарий как приложение сценария или как скомпилированный сценарий, run когда сценарий выполняется, обработчик вызывается. Можно также вызвать a run обработчик в приложении сценария из другого сценария. Для получения информации о том, как сделать это, посмотрите Вызов Приложения Сценария Из Сценария.

откройте Handlers

Приложения Mac, включая приложения сценария, получают open команда каждый раз, когда пользователь отбрасывает файл, папку или значки диска на значке Finder приложения, даже если уже работает приложение.

Если сценарий в приложении сценария включает open когда приложение получает, обработчик, обработчик выполняется open команда. open обработчик берет единственный параметр, обеспечивающий список всех элементов, которые будут открыты. Каждый элемент в спискеalias объект.

Например, следующий open обработчик составляет список путей всех элементов, отброшенных на значке приложения сценария, и сохраняет их в документе frontmost TextEdit:

on open names
    set pathNamesString to "" -- Start with empty text string.
    repeat with i in names
        -- In this loop, you can perform operations on each dropped item.
        -- For now, just get the name and append a return character.
        set iPath to (i as text)
        set pathNamesString to pathNamesString & iPath & return
    end repeat
    -- Store list in open document, to verify what was dropped.
    tell application "TextEdit"
        set paragraph 1 of front document to pathNamesString
    end tell
    return
end open

Файлы, папки или диски не перемещены, скопированы или затронуты всегда путем простого отбрасывания их на приложении сценария. Однако обработчик приложения сценария может сказать Средству поиска перемещать, копировать, или иначе управлять элементами. Для примеров, работающих с элементами Средства поиска, посмотрите Ссылку Действий Папки.

Можно также работать open обработчик путем отправки заявления сценария open команда. Для получения дополнительной информации посмотрите Вызов Приложения Сценария Из Сценария.

бездействуйте и Обработчики выхода для Оставаться-открытых-приложений

По умолчанию, приложение сценария, получающее a run или open дескрипторы команды, из которых затем выходит единственная команда и. Напротив, пребывание - открывает приложение сценария (один сохраненный, как Остаются Открытыми в Редакторе сценариев), остается открытым после того, как это запускается.

Пребывание - открытое приложение сценария может быть полезным по нескольким причинам:

  • Останьтесь - открытые приложения сценария могут получить и обработать другие команды в дополнение к run и open. Это позволяет Вам использовать приложение сценария в качестве сервера сценария, когда это работает, обеспечивающего набор обработчиков, которые могут быть вызваны любым другим сценарием.

  • Останьтесь - открытые приложения сценария могут выполнить периодические действия, даже в фоновом режиме, пока работает приложение сценария.

Два определенных обработчика, остающиеся - открытые приложения сценария часто, обеспечивают, idle обработчик и a quit обработчик.

неактивные Обработчики

Если пребывание - открытое приложение сценария включает idle обработчик, AppleScript посылает периодическое заявление сценария idle команды — по умолчанию, каждые 30 секунд — разрешение его выполнить фоновые задачи, когда это не выполняет другие действия.

Если idle обработчик возвращает положительное число, то число становится уровнем (в секундах), в котором вызывают обработчик. Если обработчик возвращает нечисловое значение, уровень не изменяется. Можно возвратиться 0 для поддержания задержки по умолчанию 30 секунд.

Например, когда сохранено как оставаться-открытое-приложение, следующий сценарий подает звуковой сигнал каждые 5 секунд:

on idle
    beep
    return 5
end idle

Результатом, возвращенным из обработчика, является просто результат последнего оператора, даже если это не включает слово return явно. (См. “return” для получения дополнительной информации.), Например, этот обработчик вызывают один раз минута, потому что значение последнего оператора равняется 60:

on idle
    set x to 10
    beep
    set x to x * 6  -- The handler returns the result (60).
end idle

Обработчики выхода

AppleScript отправляет пребывание - открытое приложение a сценария quit команда каждый раз, когда пользователь выбирает команду меню Quit или нажимает Command-Q, в то время как приложение активно. Если сценарий включает a quit обработчик, операторы в обработчике выполняются перед выходами приложения.

A quit обработчик может использоваться, чтобы установить свойства сценария, сказать другому приложению делать что-то, отображать диалоговое окно или выполнять почти любую другую задачу. Если обработчик включает a continue quit оператор, поведение выхода значения по умолчанию приложения сценария вызывается, и это выходит. Если quit возвраты обработчика, прежде чем это встретится с a continue quit оператор, приложение не выходит.

Например, этот обработчик согласовывает с пользователем прежде, чем позволить приложению выходить:

on quit
    display dialog "Really quit?" ¬
        buttons {"No", "Quit"} default button  "Quit"
    if the button returned of the result is "Quit" then
        continue quit
    end if
    -- Without the continue statement, the application doesn't quit.
end quit

Вызов приложения сценария из сценария

Сценарий может отправить команды в приложение сценария, как он может к другим приложениям. Для запуска приложения «не остаются открытыми» и выполняют его сценарий, используют a launch команда, сопровождаемая a run команда, как это:

launch application "NonStayOpen"
run application "NonStayOpen"

launch команда запускает приложение сценария, не отправляя ему неявное run команда. Когда run команда отправляется в приложение сценария, она обрабатывает команду, передает обратно ответ при необходимости и выходы.

Точно так же для запуска приложения «не остаются открытыми» и выполняют stringTest обработчик (который берет a text возразите в качестве параметра), используйте a launch команда, сопровождаемая a stringTest команда, как это:

tell application "NonStayOpen"
    launch
    stringTest("Some example text.")
end tell

Для получения информации о том, как создать приложения сценария, посмотрите Обработчики в Приложениях Сценария.