Необязательные параметры в обработчиках 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 4

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