Необязательные параметры в обработчиках AppleScript
В документацииApplescript говорится, что начиная с Yosemite параметры для обработчиков можно сделать необязательными.
Из раздела "спецификации параметров":
Поэтому, нуждаясь в обработчике с необязательными параметрами, я попытался его создать. Я зашел так далеко:Помеченные параметры могут быть объявлены со значением по умолчанию, следуя формальному имени параметра с: литерал. Это делает параметр необязательным при вызове. Например, здесь объявляется обработчик make со значением по умолчанию для параметра with data:
on make new theClass with data theData : missing value
Этот обработчик теперь может быть вызван без указания параметра с данными; обработчик увидит, что значение theddata установлено в указанное по умолчанию отсутствующее значение, которое он затем может проверить и обработать соответствующим образом.
set theResult to Create of me given the string:"stuff", info:"this"
on Create given info:missing value, thestring:"stuff"
if info is missing value then
set present to false
else
set present to true
end if
return {present, thestring}
end Create
Который компилирует, но выдает мне ошибку 'переменная thestring не определена.'
Если я вызову его только с одним параметром:
set theResult to Create of me given thestring:"stuff"
Я получаю ошибку: 'The параметр информация отсутствует для создания.- то есть параметр все-таки не является необязательным.
Как я могу получить дополнительные параметры, работающие в обработчиках Applescript?
3 ответа:
Вы должны определить терминологию на основе SDEF для вашей команды, чтобы это работало (что, в свою очередь, означает возню с пакетами XML и сценариев и потенциально создает терминологические конфликты и т. д.). Предполагается, что это сделает библиотеки AppleScript более удобными в использовании, но на самом деле это просто пустая трата времени.
Проще всего использовать обычные позиционные параметры и просто передать пользователю
missing value
для "необязательных" аргументов, которые ваш обработчик может проверить:set theResult to Create("stuff", "this") set theResult to Create("stuff", missing value) set theResult to Create(missing value, missing value) on Create(thestring, info) if thestring is missing value then set thestring to "stuff" set present to info is not missing value return {present, thestring} end Create
Или в противном случае обработчик должен взять одну запись в качестве параметра, а затем объединить ее с записью свойств по умолчанию:
set theResult to Create for {thestring:"stuff", info:"this"} set theResult to Create for {thestring:"stuff"} set theResult to Create for {} on Create for args set args to args & {info:missing value, thestring:"stuff"} set present to info is not missing value return {present, thestring of args} end Create
Ни одно из решений не является идеальным; но разве это не верно для всего в AppleScript?
Чтобы воспользоваться преимуществами необязательных помеченных параметров, определение обработчика должно присвоить параметру(параметрам), которые вы хотите сделать необязательными, значение по умолчанию. Затем, когда вызывающий объект не предоставляет этот помеченный параметр, используется значение по умолчанию.
Вот пример использования пользовательских меток, которые я нахожу более четкими, чем волшебные метки AppleScript (of, by, for и т. д.)
SayWhat given greeting:"Hola", farewell:"Adios" SayWhat given greeting:"Aloha" SayWhat given farewell:"Ciao" on SayWhat given greeting:strGreeting : "Hello", farewell:strFarewell : "Goodbye" log "You say " & strGreeting & "; I say " & strFarewell end SayWhat (*You say Hola; I say Adios*) (*You say Aloha; I say Goodbye*) (*You say Hello; I say Ciao*)
В принципе синтаксис не изменился,вы можете просто добавить значение по умолчанию в строку объявления обработчика.
set theResult to Create from "stuff" by "this" --> {true, "stuff"} set theResult to Create from "stuff" --> {false, "stuff"} on Create by info : missing value from thestring : "stuff" if info is missing value then set present to false else set present to true end if return {present, thestring} end Create
Ключевое слово
given
предназначено для булевых параметров, которые могут быть вызваны с помощьюwith
( =true
) и ещеwithout
( =false
) ключевые слова.Например (из документации)
to findNumbers of numberList above minLimit given rounding:roundBoolean … end findNumbers findNumbers of {5.1, 20.1, 20.5, 33} above 20 with rounding