Вы были очень, очень близки с вашей попыткой. Вот измененная, исправленная версия:
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()
и определить другие обработчики аналогичного характера, которые делают другие вещи с вашим списком.