Я хочу динамически вызывать функции на основе содержимого, найденного в списке ассоциаций.
Вот пример полупсевдокода. listOfFunctionsбудет передан в callFunctions.
listOfFunctions = [('function one', 'value one')
, ('function two', 'value two')
, ('function three', 'value three')]
callFunctions x = loop through functions
if entry found
then call function with value
else do nothing
Суть вопроса не в переборе списка, а в том, как вызвать функцию, когда я знаю ее имя?
Рассмотрим этот вариант использования для дальнейшего уточнения. Вы открываете командную строку и видите следующее меню.
1: Запись нового файла vHost
2: Выход
Вы записываете новый файл vHost и не видите нового меню
1: Введите новую директиву
2: Запись файла
3: Выход
Вы вводите несколько новых директив для виртуального хоста и теперь готовы записать файл.
Программа не будет слепо писать все возможные директивы, а только те, которые вы указали. Здесь на помощь приходит список ассоциаций. Написание гигантского оператора if/then/else или case — это безумие. Гораздо элегантнее было бы пройтись по списку, посмотреть, какие директивы были добавлены, и вызвать функции, чтобы записать их соответствующим образом.
Следовательно, цикл, найти имя функции, вызвать указанную функцию с предоставленным значением.
Спасибо всем, кто может помочь с этим.
Редактировать:
Вот решение, которое я придумал (конструктивная критика всегда приветствуется).
Я экспортировал функции, которые записывают директивы в список ассоциаций, так как в каждом предоставленном ответе говорилось, что достаточно просто включить функцию.
funcMap = [("writeServerName", writeServerName)
,("writeServeralias", writeServerAlias)
,("writeDocRoot", writeDocRoot)
,("writeLogLevel", writeErrorLog)
,("writeErrorPipe", writeErrorPipe)
,("writeVhostOpen", writeVhostOpen)]
В файл, который фактически записывает хосты, этот файл импортируется.
У меня есть список ассоциаций с именем hostInfoдля имитации некоторого фиктивного значения, которое будет получено от конечного пользователя, и функция с именем runFunction, которая использует метод, предоставленный edalorzoдля фильтрации обоих списков. Сопоставляя ключи обоих списков, я гарантирую, что правильная функция вызывается с правильным значением.
import Vhost.Directive
hostInfo = [("writeVhostOpen", "localhost:80")
,("writeServerName", "norics.com")]
runFunctions = [f val | (mapKey, f) <- funcMap, (key, val) <- hostInfo, mapKey == key]