Объекты сценария

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

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

Верхний уровень script объект является тем, реализующим полный сценарий, Вы продолжаете работать. Любой script объект может содержать вложенный script объекты, каждый из которых определяется точно так же, как верхний уровень script объект, за исключением того, что вложенный 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 команда; они выполняются когда a script объект получает 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. При поиске библиотеки расположения ищутся в порядке, перечисленном, и первый сценарий соответствия используется:

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

  2. Если приложение, выполняющее сценарий, является пакетом, каталогом Resources пакета приложения. Это означает, что приложения сценария («апплеты» и «капельки») могут быть упакованы и распределены с библиотеками, которыми они пользуются. Это также включает приложения, выполняющие сценарии для обеспечения библиотек для использования теми сценариями.

  3. Папка Library в корневом каталоге пользователя, ~/Library. Это - расположение для установки библиотек для использования отдельным пользователем и является рекомендуемым расположением во время разработки библиотеки.

  4. Компьютерная папка Library, /Library. Библиотеки расположились, здесь доступны всем пользователям компьютера.

  5. Папка сетевой библиотеки, /Network/Library. Библиотеки расположились, здесь доступны многократным компьютерам в сети.

  6. Папка системной библиотеки, /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 объекты ниже этого содержат a on 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»