Есть ли способ передать необязательные параметры обработчикам в сценарии Apple, когда мы должны передать только один параметр - PullRequest
0 голосов
/ 03 сентября 2018

Я написал обработчик

on test(action)

  set x to "0"
  set y to "1"
  if action = "multiply"
     return  x*y
  end if 
  return x+y
end test

Я хочу назвать некоторые места как test () без каких-либо параметров, где он возвращает сумму, а в других местах я хочу передать параметры как «умножить».

Поэтому я ищу способ установить дополнительные параметры.

1 Ответ

0 голосов
/ 03 сентября 2018

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

Но это выходит за рамки этого вопроса, поэтому я оставлю ваше воображение, чтобы подумать, почему эта конструкция может быть более особенной, чем кажется на первый взгляд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...