我希望根据关联列表中的内容动态调用函数。
这是半伪代码中的示例。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:退出
您为 vHost 输入了一些新指令,现在可以编写文件了。
该程序不会盲目地编写它可以编写的每一个指令,而是只会编写您提供的指令。这就是关联列表的用武之地。写一个巨大的 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]