Обработчик Applescript, повторите с i от 1 до номера this_list - PullRequest
0 голосов
/ 31 октября 2018

Если бы кто-то мог сказать мне, что я здесь делаю неправильно, или указать мне правильное направление, чтобы найти ответ, я был бы благодарен.

У меня есть список номеров и список соответствующих имён

numList {"1", "2", "4", "6"}
nameList {"bob", "joel", "mickey", "tara", "jason", "stacey"}

Я пытаюсь сделать обработчик, чтобы взять числа из numList и получить соответствующие имена в виде списка.

The result should be {"bob", "joel", "tara", "stacey"

это то, что у меня есть, но оно не возвращает правильные имена.

on myFirstHandler(this_list, other_list)
    set rest_list to {}
    set availlist to {}
    repeat with h from 1 to the number of this_list
        set the rest_list to item h of other_list
        set the end of the availlist to rest_list
    end repeat
    return availlist
end myFirstHandler

set numList {"1", "2", "4", "6"}
set nameList {"bob", "joel", "mickey", "tara", "jason", "stacey"}

myFirstHandler(numList, nameList)
set AlcoholAvailable to the result

returns {"bob", "joel", "mickey", "tara"}

1 Ответ

0 голосов
/ 31 октября 2018

Вы были очень, очень близки с вашей попыткой. Вот измененная, исправленная версия:

on myFirstHandler(this_list, other_list)
    set rest_list to {}

    repeat with h in this_list
        set the end of rest_list to item h of other_list
    end repeat

    return rest_list
end myFirstHandler


set numList to {1, 2, 4, 6}
set nameList to {"bob", "joel", "mickey", "tara", "jason", "stacey"}

myFirstHandler(numList, nameList)
set AlcoholAvailable to the result

Основным ключевым отличием является способ определения цикла repeat: при первоначальной попытке вы просматривали индексы списка источников, поэтому вы всегда были будем использовать числа, которые запускаются 1, 2, 3, 4, 5, 6, и, следовательно, извлекать эти элементы из вашего целевого списка. В моей модифицированной версии я перебираю значения , поэтому я могу использовать числа из списка источников 1, 2, 4, 6.

Итак, сравните ваше предложение repeat:

repeat with h from 1 to the number of this_list

с моим:

repeat with h in this_list

Оба являются совершенно правильными битами AppleScript, но делают несколько разные вещи: один использует индексы , другой использует значения .


Немного более продвинутый, но все же более универсальный способ сделать это будет выглядеть так:

set numList to {1, 2, 4, 6}
set nameList to {"bob", "joel", "mickey", "tara", "jason", "stacey"}

on map(L, function)
    local L, function

    tell result to repeat with x in L
        set x's contents to function's fn(x)
    end repeat

    L
end map

on itemInList(L)
    script
        on fn(x)
            item x of L
        end fn
    end script
end itemInList

map(numList, itemInList(nameList))

Здесь я определил «базовую» функцию отображения . Функция mapping принимает функцию, в данном случае такую, которая возвращает элемент из целевого списка, и применяет эту функцию к каждому элементу из массива, в данном случае к вашему исходному списку, numList. Этот список изменяется в процессе, поэтому вы обнаружите, что элементы numList были заменены на {"bob", "joel", "tara", "stacey"}.

Что делает эту конструкцию особенной, так это то, что вы можете заменить функцию (обработчик), которую map использует в этом примере, itemInList() и определить другие обработчики аналогичного характера, которые делают другие вещи с вашим списком.

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