2015-10-09 2 views
2

Applescript documentation говорит, что параметры Yosemite по параметрам для обработчиков могут быть необязательными.Необязательные параметры в обработчиках AppleScript

В разделе «Технические характеристики Параметр»:

Labeled parameters may be declared with a default value by following the formal parameter name with :literal. Doing so makes the parameter optional when called. For example, this declares a make handler with a default value for the with data parameter:

on make new theClass with data theData : missing value

This handler can now be called without supplying a with data parameter; the handler would see theData set to the specified default missing value, which it could then test for and handle appropriately.

Так, нуждаясь в обработчике с дополнительными параметрами, я пытался создать. Я зашел так далеко:

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" 

Я получаю ошибку: "Параметр Информация отсутствует для создания. т. е. параметр не является обязательным.

Как я могу получить необязательные параметры, работающие в обработчиках Applescript?

ответ

1

Вы должны определить терминологию 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?

+0

Извините, что не отметили это, как ответили раньше; Я перешел к другим проектам и не смог посмотреть на это. Но я думаю, что это правильно: это будет больше проблем, чем того стоит, и я должен продолжать делать это старомодным позиционным способом. – Rhiannon

1

В принципе синтаксис не изменился, вы можете просто добавить значение по умолчанию в строку объявления обработчика.

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 
+0

[документация обработчика AppleScript в] (https://developer.apple.com/library/mac/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_handlers.html) говорит, что мы должны предоставить «Одна пара значений метки для каждой определяемой пользователем метки и параметра, определенного для обработчика, который не является логическим значением , Первая пара предшествует указанному слову; запятая предшествует каждой дополнительной паре. Порядок пар не должен соответствовать порядку в определении обработчика. ' Это означает, что «заданный» может принимать небулевые значения. – Rhiannon

0

Для того чтобы воспользоваться дополнительными помеченными параметрами, определение обработчика ДОЛЖНО назначить значение по умолчанию параметрам, которые вы хотите быть дополнительными. Затем, когда вызывающий абонент не передает этот помеченный параметр, используется значение по умолчанию.

Вот пример использования определенного пользователя метки, которые я нахожу яснее, чем магические AppleScript наклеек (из, с помощью, и т.д.)

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*)