Об обработчиках
Когда разработчики сценария хотят к фактору и снова используют свой код, они могут повернуться к обработчикам. Обработчик является набором операторов, которые могут быть вызваны по имени. Обработчики также известны как функции, подпрограммы или методы.
В этой главе описываются, как работать с обработчиками в следующих разделах:
Для подробной справочной информации посмотрите Ссылку Обработчика.
Основы обработчика
Обработчик является набором операторов, которые могут быть вызваны по имени. Обработчики полезны в сценариях, выполняющих то же действие больше чем в одном месте. Можно упаковать операторы, выполняющие определенную задачу как обработчик, дающие ему описательное имя и вызывающие его отовсюду в сценарии. Это делает сценарий короче и проще поддержать.
Сценарий может содержать один или несколько обработчиков. Однако Вы не можете вложить определение обработчика в другом обработчике (несмотря на то, что объект сценария, определенный в обработчике, может содержать другие обработчики).
Определение для обработчика указывает параметры, которые оно использует, если таковые имеются. Это не указывает класс для своих параметров. Однако большинство обработчиков ожидает, что каждый параметр будет определенного класса, таким образом, будет полезно добавить комментарий, перечисляющий ожидаемые типы классов.
При вызове обработчика необходимо перечислить его параметры согласно тому, как они указаны в его определении. Обработчики, возможно, маркировали, позиционный, или чередовали параметры, описал в последующих разделах.
Определение обработчика может содержать объявления переменной и операторы. Это может использовать 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 |
Для получения информации о том, как создать приложения сценария, посмотрите Обработчики в Приложениях Сценария.