1. Необязательные маркированные параметры
Дополнительные параметры возможны, если вы объявляете обработчик, используя помеченные параметры . Однако для того, чтобы этот параметр был действительным, должно быть как минимум два параметра.
Например:
on array from a as integer : 1 to b as integer
local a, b
set L to {}
repeat with i from a to b
set end of L to i
end repeat
L
end
Этот обработчик создает список целых чисел. Он принимает два параметра, a
и b
, из которых a
является необязательным параметром, которому по умолчанию присваивается значение 1
.
Таким образом,
array from 4 to 10
выдаст этот список:
{4, 5, 6, 7, 8, 9, 10}
тогда:
array to 10
выдаст список, как если бы вы вызвали обработчик с помощью array from 1 to 10
:
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
Можно сделать необязательным a
и b
, однако при вызове обработчика должен быть включен хотя бы один параметр .
from
и to
- это параметр метки , из которых есть много предопределенных предлогов, которые можно использовать для маркировки параметров. Их можно вызывать в любом порядке:
array from 10 to 1
идентичен
array from 1 to 10
и не не изменяют порядок списка.
Другие этикетки включают в себя:
about, above, against, apart from, around, aside from, at,
below, beneath, beside, between, by, for, from, instead of,
into, on, onto, out of, over, since, thru, under
и вы можете определить свои собственные метки, которые используются вместе с ключевым словом given
, но я оставлю вас читать об этом, используя ссылку выше, которую я оставил.
2. Ваш test()
обработчик
Ваш обработчик принимает только один параметр, поэтому он, к сожалению, не может быть необязательным. Однако, если вы введете x
и y
в качестве параметров, то вы сможете сделать action
необязательным:
on test over {x, y} given function:action : "add"
local x, y, action
if action = "multiply" then return x * y
x + y
end test
Тогда:
test over {2, 5} given function:"multiply" --> 10
test over {2, 5} --> 7
3. Обработчик как параметр
Это примечание, которое не имеет прямого отношения к вашему вопросу, но частично относится к тому, что вы делаете.
Обработчики также могут быть переданы как параметры, но не могут быть сделаны необязательными. Я оставлю этот сценарий с вами, чтобы пропустить и проанализировать, и познакомить вас с возможностями, которые это может открыть. Если вы когда-либо использовали функциональный язык, такой как Haskell или Lisp , это будет очень знакомо:
to apply to {x as number, y as number} given function:func as handler
local x, y, func
script
property fn : func
end script
result's fn(x, y)
end apply
to add(x, y)
x + y
end add
to multiply(x, y)
x * y
end multiply
Это далеко не так мощно, как то, что могут делать надлежащие функциональные языки, но это гораздо мощнее, чем то, что большинство AppleScripters понимают, что AppleScript может делать:
apply to {5, 2} given function:multiply
Но это выходит за рамки этого вопроса, поэтому я оставлю ваше воображение, чтобы подумать, почему эта конструкция может быть более особенной, чем кажется на первый взгляд.