几天前我开始在Lua编程。我已经熟悉了语法,并设法为Prosody XMPP服务器编写了一个模块。我在Prosody服务器配置(在Lua中)中搜索了一段代码。
VirtualHost "example.com"
enabled = false;
ssl = {
key = "certs/example.com.key";
certificate = "certs/example.com.crt";
};
我想弄清楚第二行中的表是如何链接到第一行的。
它是VirtualHost功能的参数吗?即代码可以写成:
VirtualHost "example.com", {
enabled = false;
ssl = {
key = "certs/example.com.key";
certificate = "certs/example.com.crt";
};
};
我需要进一步研究一些Lua概念吗?
答案 0 :(得分:10)
第一行与其余行之间没有直接联系。第一行相当于VirtualHost("example.com")
- 如果函数调用只传递一个字符串参数,则不需要括号。
查看Prosody的源代码,这里发生的是加载配置文件的代码使用setfenv
和setmetatable
的组合来捕获全局变量(ssl
和enabled
)。当您编写enabled = false
时,它实际上并不设置全局变量enabled
,而是调用由Prosody代码定义的函数,该函数在当前定义的虚拟主机上设置属性。
这一切都在core / configmanager.lua中的parsers.lua.load
函数中实现。
您可以阅读setfenv
here和setmetatable
here(具体此代码使用__newindex metamethod)。