Объекты сценария
В этой главе описываются script
объект, использующийся для реализации всех сценариев AppleScript. Прежде, чем считать эту главу, необходимо быть знакомы с информацией в AppleScript и Объектах.
Объект сценария является определяемым пользователем объектом, который может объединить данные (в форме свойств) и действия (в форме обработчиков и дополнительный script
объекты). Объекты сценария поддерживают наследование, позволяя Вам определить иерархию объектов, совместно использующих свойства и обработчики. Можно также расширить или изменить поведение обработчика в одном script
возразите при вызове его от другого script
объект.
Верхний уровень script
объект является тем, реализующим полный сценарий, Вы продолжаете работать. Любой script
объект может содержать вложенный script
объекты, каждый из которых определяется точно так же, как верхний уровень script
объект, за исключением того, что вложенный script
объект заключается в скобки с операторами, отмечающими его начало и конец.
В этой главе описываются script
объекты в следующих разделах:
Определение Объектов сценария показывает синтаксис для определения
script
объекты и включают простой пример.Инициализация Объектов сценария описывает, как AppleScript создает a
script
объект со свойствами и обработчиками Вы определили.Отправка Команд к Объектам сценария описывает, как Вы используете
tell
операторы для отправки команд вscript
объекты.Библиотеки сценария описывают библиотеки сценария и как использовать их из других сценариев.
Наследование в Объектах сценария описывает работы наследования и как можно использовать его для совместного использования функциональности в
script
объекты Вы определяете.
Определение объектов сценария
Каждый script
определение объекта (за исключением верхнего уровня script
объект), начинается с ключевого слова script
, сопровождаемый именем переменной и концами с ключевым словом end
(или end script
). Промежуточные операторы могут быть любой комбинацией определений свойства, определений обработчика, вложенных script
определения объектов и другие операторы AppleScript.
Синтаксис a script
определение объекта следующие:
script
variableName
[ ( property
| prop
) parent :
parentSpecifier]
[ ( property
| prop
) propertyLabel: initialValue]...
[handlerDefinition]...
[оператор]...
end
[ script
]
- variableName
Идентификатор переменной для сценария. Можно обратиться к объекту сценария этим именем в другом месте в сценарии.
- parentSpecifier
Указывает родителя
script
объект, обычно другойscript
объект.Для получения дополнительной информации посмотрите Наследование в Объектах сценария.
- propertyLabel
Идентификатор, уникальный в
script
объект, указывающий характеристику объекта; эквивалентный переменной экземпляра.- initialValue
Значение, присваивающееся свойству каждый раз
script
объект инициализируется.script
объекты инициализируются, когда скомпилировано. initialValue требуется в определениях свойства.- handlerDefinition
Обработчик для команды
script
объект может ответить на; эквивалентный методу. Для получения дополнительной информации займитесь Ссылка Обработчика и Обработчики.- оператор
Любой оператор AppleScript. Операторы кроме обработчика и определений свойства обрабатываются, как будто они были частью неявного определения обработчика для
run
команда; они выполняются когда ascript
объект получаетrun
команда.
Вот простое script
определение объекта:
script John |
property HowManyTimes : 0 |
to sayHello to someone |
set HowManyTimes to HowManyTimes + 1 |
return "Hello " & someone |
end sayHello |
end script |
Это определяет a script
объект, который может обработать sayHello
команда. Это присваивается script
возразите против переменной John
. Определение включает обработчик для sayHello
команда. Это также включает свойство, вызванное HowManyTimes
, это указывает сколько раз sayHello
команду вызвали.
Обработчик в a script
определение объекта следует за теми же синтаксическими правилами как любой другой обработчик.
Можно использовать a tell
оператор для отправки команд в a script
объект. Например, следующее утверждение отправляет sayHello
управляйте script
объект, определенный выше.
tell John to sayHello to "Herb" --result: "Hello Herb" |
Можно управлять свойствами script
объекты при помощи get
команда для получения значения свойства и set
или copy
команда для изменения значения. Значение свойства является персистентным — оно сбрасывается каждый раз, когда Вы компилируете сценарий, но не при выполнении его.
Инициализация объектов сценария
Когда Вы определяете a script
объект, это может содержать свойства, обработчики, и вложенный script
определения объектов. При выполнении сценария, содержащего его AppleScript создает a script
объект с определенными свойствами, обработчиками, и вложенный script
объекты. Процесс создания экземпляра a script
объект из его определения вызывают инициализацией. A script
объект должен быть инициализирован, прежде чем он сможет реагировать на команды.
Верхний уровень script
объект инициализируется каждый раз сценарий run
обработчик выполняется. Точно так же при определении сценария в обработчике AppleScript инициализирует a script
возразите каждый раз, когда обработчик вызывают. Переменные параметра в определении обработчика становятся локальными переменными script
объект.
Например, makePoint
обработчик в следующем сценарии содержит a script
определение объекта для script
объект thePoint
:
on makePoint(x, y) |
script thePoint |
property xCoordinate:x |
property yCoordinate:y |
end script |
return thePoint |
end makePoint |
set myPoint to makePoint(10,20) |
get xCoordinate of myPoint --result: 10 |
get yCoordinate of myPoint --result: 20 |
AppleScript инициализирует script
объект thePoint
когда это выполняется makePoint
команда. После вызова к makePoint
, переменная myPoint
относится к этому script
объект. Переменные параметра в makePoint
обработчик, в этом случае, x
и y
, станьте локальными переменными script
объект. Начальное значение x
10, и начальное значение y
20, потому что те - параметры, переданные makePoint
обработчик, инициализировавший script
объект.
Если Вы добавили следующую строку до конца предыдущего сценария и выполнили его, переменная myOtherPoint
относился бы к второму экземпляру script
объект thePoint
, с различными значениями свойств:
set myOtherPoint to makePoint(30,50) |
makePoint
сценарий является своего рода создающей функцией конструктора script
объекты, представляющие точки.
Отправка команд к объектам сценария
Можно использовать tell
операторы для отправки команд в script
объекты. Например, следующий tell
оператор отправляет два sayHello
команды к script
объект John
(определенный ниже):
tell John |
sayHello to "Herb" |
sayHello to "Grace" |
end tell |
Для a script
объект реагировать на команду в a tell
оператор, любой script
возразите или его родительский объект должен иметь обработчик для команды. Для получения дополнительной информации о родительских объектах, посмотрите Наследование в Объектах сценария.
A script
определение объекта может включать неявное run
обработчик, состоя из всех исполнимых операторов, которые являются за пределами любого обработчика или вложены script
объект, или это может включать явное run
начинающийся обработчик on run
, но это может не содержать обоих — такой сценарий не скомпилирует. Если сценарий не имеет никакого обработчика выполнения (например, сценарий, служащий библиотекой обработчиков, как описано в Сохранении и Загрузке Библиотек Обработчиков), выполнение сценария ничего не делает. Однако отправляя ему явное run
команда вызывает ошибку. Для получения дополнительной информации посмотрите выполненные Обработчики.
display dialog
команда в следующем script
определение объекта является единственным исполнимым оператором на верхнем уровне, таким образом, это составляет script
неявный объект run
когда сценарий отправляет a, обработчик и выполняется run
команда к script
объект John
, с оператором tell John to run
.
script John |
property HowManyTimes : 0 |
to sayHello to someone |
set HowManyTimes to HowManyTimes + 1 |
return "Hello " & someone |
end sayHello |
display dialog "John received the run command" |
end script |
tell John to run |
Можно также использовать притяжательное для отправки команды в a script
объект. Например, любая из следующих двух форм отправляют sayHello
команда к сценарию John
(первая версия компилирует во второе):
John's sayHello to "Jake" --result: "Hello Jake" |
sayHello of John to "Jake" --result: "Hello Jake" |
Библиотеки сценария
Верхний уровень script
объект, сохраненный в папке Script Libraries, становится библиотекой сценария, применимой другими сценариями. Библиотеки позволяют Вам совместно использовать и обработчики повторного использования, реорганизовать большие сценарии в ряд меньших библиотек, которыми проще управлять и создать более богатую, высокоуровневую функциональность из более простых библиотек.
Создание библиотеки
Основное требование для сценария, чтобы быть библиотекой сценария является своим расположением: это должен быть документ сценария в папке «Script Libraries» в одной из следующих папок Library. При поиске библиотеки расположения ищутся в порядке, перечисленном, и первый сценарий соответствия используется:
. Если сценарий пакетом, каталогом Resources пакета сценария, ссылающийся на библиотеку является, это означает, что сценарии могут быть упакованы и распределены с библиотеками, которыми они пользуются.
Если приложение, выполняющее сценарий, является пакетом, каталогом Resources пакета приложения. Это означает, что приложения сценария («апплеты» и «капельки») могут быть упакованы и распределены с библиотеками, которыми они пользуются. Это также включает приложения, выполняющие сценарии для обеспечения библиотек для использования теми сценариями.
Папка Library в корневом каталоге пользователя,
~/Library
. Это - расположение для установки библиотек для использования отдельным пользователем и является рекомендуемым расположением во время разработки библиотеки.Компьютерная папка Library,
/Library
. Библиотеки расположились, здесь доступны всем пользователям компьютера.Папка сетевой библиотеки,
/Network/Library
. Библиотеки расположились, здесь доступны многократным компьютерам в сети.Папка системной библиотеки,
/System/Library
. Это библиотеки, предоставленные OS X.
Библиотеки сценария также имеют name
, id
, и version
свойства. Рекомендуется определить все три, специально для библиотек, которые Вы планируете распределить публично: выполнение так позволяет клиентам однозначно идентифицировать определенные версии библиотек, имеющих функциональность, в которой они нуждаются. Эти свойства могут быть определены любой как property
определения в самом сценарии, или, для пакетов сценария, с помощью секции Содержания Пакета в Редакторе сценариев. Для получения дополнительной информации посмотрите script
ссылка класса.
Библиотека сценария может быть однофайловым (scpt) или связать формат (scptd). Если библиотека является пакетом, она может определить свою собственную терминологию и может использовать соединенные мостом платформы Objective C.
Определение терминологии сценариев
Библиотеки могут определить терминологию сценариев, включая команды, свойства и перечисляемые значения, путем предоставления Определения Сценариев (sdef) файл в их пакете. Как приложения, эта терминология доступна клиентским сценариям, когда они предназначаются для библиотеки с tell
или use
, и к самому сценарию библиотеки.
Для определения терминологии создайте sdef файл, как описано в Руководстве по созданию сценариев Какао при Подготовке Файла Определения Сценариев. Затем скопируйте файл в каталог Resources пакета и установите ключ Info.plist OSAScriptingDefinition
к базовому имени sdef файла (т.е. имя файла без «.sdef» расширения). Секция Содержания Пакета Редактора сценариев может сделать это для Вас: перетащите файл в список «Ресурсов», чтобы скопировать файл в пакет и ввести базовое имя sdef файла в поле «Scripting Definition».
Используя платформы Objective C
Библиотеки могут использовать системные платформы путем ссылки на классы Objective C и методы с помощью моста AppleScript/Objective-C, AppleScriptObjC. Для включения моста необходимо установить ключ Info.plist OSAAppleScriptObjCEnabled
оцените истине. Секция Содержания Пакета Редактора сценариев включает флажок «AppleScript/Objective-C Library» для установки этого значения. Библиотека сценария должна также явно перечислить платформы, она будет использовать использование a use
оператор. Для получения дополнительной информации посмотрите использование (платформа).
Пользование библиотекой
Библиотека сценария определяет объект сценария, который клиентский сценарий может тогда сослаться и затем отправить командам в, как описано в Передающих Командах к Объектам сценария. Библиотеки идентифицируются по имени:
script "My Library" |
AppleScript будет искать различные папки Script Library, как описано выше в Создании Библиотеки, и создавать экземпляр сценария библиотеки. В отличие от результата load script
, этот экземпляр совместно используется и сохраняется для, по крайней мере, времени жизни клиентского сценария, таким образом, Вы не должны сохранять его в переменной, и состояние будет сохранено, в то время как работает клиентский сценарий. Например, учитывая этот сценарий библиотеки:
property name : "Counter" |
property nextNumberProperty : 0 |
on nextNumber() |
set my nextNumberProperty to my nextNumberProperty + 1 |
return my nextNumberProperty |
end nextNumber |
Этот клиентский сценарий, несмотря на ссылку на библиотеку полностью оба раза, зарегистрирует «1» и затем «2»:
tell script "Counter" to log its nextNumber() -- logs "1" |
tell script "Counter" to log its nextNumber() -- logs "2" |
Наследование в объектах сценария
Можно использовать механизм наследования AppleScript для определения связанный script
объекты с точки зрения друг друга. Это позволяет Вам совместно использовать свойство и определения обработчика среди многих script
объекты, не повторяя совместно используемые определения. Наследование описано в следующих разделах:
Цепочка наследования AppleScript
Верхний уровень script
объект является родителем всех другой script
объекты, несмотря на то, что любой script
объект может указать различный родительский объект. Верхний уровень script
объект также имеет родителя — сам AppleScript (компонент AppleScript). И даже AppleScript имеет родителя — текущее приложение. Имя того приложения (который является обычно Редактором сценариев) может быть получено через глобальную константу current application
. Эта иерархия определяет цепочку наследования, которую AppleScript ищет для нахождения цели для команды или определения срока.
Каждый script
объект имеет доступ к свойствам, обработчикам и объектам сценария, которые это определяет, а также к определенным его родителем и теми из любого другого объекта в цепочке наследования, включая AppleScript. Вот почему константы и свойства, описанные в Глобальных Константах в AppleScript, доступны любому сценарию.
Определение Наследования Через родительское Свойство
При работе с script
объекты, наследование является возможностью дочернего элемента script
объект взять свойства и обработчики родительского объекта. Вы указываете наследование с parent
свойство.
Объект перечислен в a parent
определение свойства вызывают родительским объектом или родителем. A script
объект, включающий a parent
свойство упоминается как дочерний объект сценария или дочерний элемент. parent
свойство не требуется, хотя, если Вы не указаны, каждый сценарий является дочерним элементом сценария верхнего уровня, как описано в Цепочке Наследования AppleScript. A script
объект может иметь много дочерних элементов, но дочерний элемент script
объект может иметь только одного родителя. Родительский объект может быть любым объектом, таким как a list
или application
объект, но это обычно - другой script
объект.
Синтаксис для определения родительского объекта
( property
| prop
) parent :
переменная
- переменная
Идентификатор для переменной, относящейся к родительскому объекту.
A script
объект должен быть инициализирован, прежде чем он сможет быть присвоен как родитель другого script
объект. Это означает что определение родителя script
объект (или команда, вызывающая функцию, создающую родителя script
объект), должен прибыть перед определением дочернего элемента в том же сценарии.
Некоторые примеры наследования
Отношение наследования между script
объекты должны быть знакомы тем, кто познакомился с C++ или другими языками объектно-ориентированного программирования. Дочерний элемент script
объект, наследовавший обработчики и свойства, определенные в его родителе, походит на класс C++, наследовавший методы и переменные экземпляра от его родительского класса. Если у дочернего элемента нет его собственного определения свойства или обработчика, это использует унаследованное свойство или обработчик. Если у дочернего элемента есть его собственное определение определенного свойства или обработчика, то он игнорирует (или переопределения) унаследованное свойство или обработчик.
Перечисление 4-1 показывает определения родителя script
объект вызывают Alex
и дочерний элемент script
объект вызывают AlexJunior
.
Перечисление 4-1 пара объектов сценария с простыми отношениями отцов и детей
script Alex |
on sayHello() |
return "Hello, " & getName() |
end sayHello |
on getName() |
return "Alex" |
end getName |
end script |
script AlexJunior |
property parent : Alex |
on getName() |
return "Alex Jr" |
end getName |
end script |
-- Sample calls to handlers in the script objects: |
tell Alex to sayHello() --result: "Hello, Alex" |
tell AlexJunior to sayHello() --result: "Hello, Alex Jr." |
tell Alex to getName() --result: "Alex" |
tell AlexJunior to getName() --result: "Alex Jr" |
Каждый script
объект определяет a getName()
обработчик для возврата его имени. script
объект Alex
также определяет sayHello()
обработчик. Поскольку AlexJunior
объявляет, что Алекс его родительский объект, это наследовалось sayHello()
обработчик.
Используя a tell
оператор для вызова sayHello()
обработчик script
объект Alex
возвраты "Hello, Alex"
. Вызов того же обработчика script
объект AlexJunior
возвраты "Hello, Alex Jr"
— несмотря на то, что то же sayHello()
обработчик в Alex
когда тот обработчик вызывает, выполняется getName()
, это getName()
в AlexJunior
это выполняется.
Отношение между родителем script
возразите и его дочерний элемент script
объекты являются динамичными. Если свойства родительского изменения, также - унаследованные свойства дочерних элементов. Например, script
объект JohnSon
в следующем сценарии наследовал vegetable
свойство от script
объект John
.
script John |
property vegetable : "Spinach" |
end script |
script JohnSon |
property parent : John |
end script |
set vegetable of John to "Swiss chard" |
vegetable of JohnSon |
--result: "Swiss chard" |
Когда Вы изменяетесь vegetable
свойство script
объект John
с set
команда, Вы также изменяетесь vegetable
свойство дочернего элемента script
объект Simple
. Результат последней строки сценария "Swiss chard"
.
Точно так же, если дочерний элемент изменяет одно из его унаследованных свойств, значение в родительском объекте также изменяется. Например, script
объект JohnSon
в следующем сценарии наследовался vegetable
свойство от script
объект John
.
script John |
property vegetable : "Spinach" |
end script |
script JohnSon |
property parent : John |
on changeVegetable() |
set my vegetable to "Zucchini" |
end changeVegetable |
end script |
tell JohnSon to changeVegetable() |
vegetable of John |
--result: "Zucchini" |
Когда Вы изменяетесь vegetable
свойство script
объект JohnSon
к "Zucchini"
с changeVegetable
команда, vegetable
свойство script
объект John
также изменения.
Предыдущий пример демонстрирует важный момент об унаследованных свойствах: относиться к унаследованному свойству из дочернего элемента script
объект, необходимо использовать зарезервированное слово my
или of me
указать, что значение, к которому Вы обращаетесь, является свойством тока script
объект. (Можно также использовать слова of parent
указать, что значение является свойством родителя script
объект.), Если Вы не делаете, AppleScript предполагает, что значение является локальной переменной.
Например, если Вы обращаетесь к vegetable
вместо my vegetable
в changeVegetable
обработчик в предыдущем примере, результат "Spinach"
. Для соответствующей информации посмотрите это и меня Ключевые слова.
Используя продолжать Оператор в Объектах сценария
В дочернем элементе script
объект, можно определить обработчик с помощью того же имени как обработчик, определенный в его родительском объекте. В реализации дочернего обработчика у Вас есть несколько опций:
Обработчик в дочернем элементе
script
объект может быть независим от того в его родителе. Это позволяет Вам вызывать любой обработчик, как Вы желаете.Обработчик в дочернем элементе может просто вызвать обработчик в своем родителе. Это позволяет дочернему объекту использовать в своих интересах реализацию родителя (как показано в
script
объекты ниже этого содержат aon identify
обработчик).Обработчик в дочернем элементе может вызвать обработчик в своем родителе, изменение значений передало ему или выполнив дополнительные операторы прежде или после вызова родительского обработчика. Это позволяет дочернему объекту изменять или добавлять к поведению его родителя, но все еще использовать в своих интересах реализацию родителя.
Обычно, если дочерний элемент script
возразите и его родитель, у обоих есть обработчики для той же команды, дочерний элемент использует его собственный обработчик. Однако обработчик в дочернем элементе script
объект может обработать команду сначала, и затем использовать a continue
оператор для вызова обработчика для той же команды в родителе.
Эту передачу управления к другому объекту вызывают делегацией. Путем делегирования команд к родителю script
объект, дочерний элемент может расширить поведение обработчика, содержавшегося в родителе, не имея необходимость повторять все определение обработчика. После того, как родитель обрабатывает команду, AppleScript продолжает в месте в дочернем элементе где continue
оператор выполнялся.
Синтаксис для a continue
оператор показан в “continue”
.
Следующий сценарий включает два script
определения объектов, Elizabeth
и ChildOfElizabeth
.
script Elizabeth |
property HowManyTimes : 0 |
to sayHello to someone |
set HowManyTimes to HowManyTimes + 1 |
return "Hello " & someone |
end sayHello |
end script |
script ChildOfElizabeth |
property parent : Elizabeth |
on sayHello to someone |
if my HowManyTimes > 3 then |
return "No, I'm tired of saying hello." |
else |
continue sayHello to someone |
end if |
end sayHello |
end script |
tell Elizabeth to sayHello to "Matt" |
--result: "Hello Matt", no matter how often the tell is executed |
tell ChildOfElizabeth to sayHello to "Bob" |
--result: "Hello Bob", the first four times the tell is executed; |
-- after the fourth time: "No, I’m tired of saying hello." |
В этом примере, обработчик, определенный ChildOfElizabeth
для sayHello
команда проверяет значение HowManyTimes
свойство каждый раз обработчик выполняется. Если значение больше, чем 3, ChildOfElizabeth
возвращает сообщение, отказывающееся сказать привет. Иначе, ChildOfElizabeth
вызовы sayHello
обработчик в родителе script
объект (Elizabeth
), который возвращает стандартное приветственное сообщение. Слово someone
в continue
оператор является переменной параметра. Это указывает, что параметр получил с оригиналом sayHello
команда будет передана обработчику в родительском сценарии.
A continue
оператор может изменить параметры команды прежде, чем делегировать его. Например, предположите следующий script
объект определяется в том же сценарии как предыдущий пример. Первое continue
оператор изменяет прямой параметр sayHello
команда от "Bill"
к "William"
. Это делает это путем указания значения "William"
вместо переменной параметра someone
.
script AnotherChildOfElizabeth |
property parent : Elizabeth |
on sayHello to someone |
if someone = "Bill" then |
continue sayHello to "William" |
else |
continue sayHello to someone |
end if |
end sayHello |
end script |
tell AnotherChildOfElizabeth to sayHello to "Matt" |
--result: "Hello Matt" |
tell AnotherChildOfElizabeth to sayHello to "Bill" |
--result: "Hello William" |
Если Вы переопределяете обработчик родителя этим способом, зарезервированными словами me
и my
в обработчике родителя больше не относятся к родителю, как продемонстрировано в следующем примере.
script Hugh |
on identify() |
me |
end identify |
end script |
script Andrea |
property parent : Hugh |
on identify() |
continue identify() |
end identify |
end script |
tell Hugh to identify() |
--result: «script Hugh» |
tell Andrea to identify() |
--result: «script Andrea» |