美好的一天,我正在尝试理解更多基于Lua的NSE脚本,但是当使用函数作为表中的元素时,我无法理解与语法相关的内容。我将展示脚本nmap / scripts / broadcast-rip-discver.nse的部分内容,我迷路了:
RIPv2 = {
-- The Request class contains functions to build a RIPv2 Request
Request = {
-- Creates a new Request instance
--
-- @param command number containing the RIPv2 Command to use
-- @return o instance of request
-- code ommitted (give values to the table o)
setmetatable(o, self)
self.__index = self
return o
end,
-- Converts the whole request to a string
__tostring = function(self)
--- -- code ommitted ( Override the metafunction __tostring)
return data
end,
},
-- The Response class contains code needed to parse a RIPv2 response
Response = {
-- Creates a new Response instance based on raw socket data
--
-- @param data string containing the raw socket response
-- @return o Response instance
new = function(self, data)
local o = { data = data }
-- code ommitted (Read from data and pass values to o)
setmetatable(o, self)
self.__index = self
return o
end,
}
}
从剧本的“动作”部分我们有这样的用途
local rip = RIPv2.Request:new(RIPv2.Command.Request)
local response = RIPv2.Response:new(data) -- Data has been already give a value
据我所知,为这两行创建表RIPv2的新实例是“相似的”。因为所有的函数都在一个表中(这不是一个类,因为Lua只有基本的工具来使事情变得相似但对类不一样)所以Lua强制要求的“自我”参数有一个想法。
但是我无法理解这就是为什么尝试将表RIPv2中的函数覆盖到表o,我的意思是这些行是什么目标?: setmetatable(o,self))
据我所知,变量表o现在可以具有与RIPv2相同的功能,但这部分让我发疯,我在Nmap的论坛上找不到直接答案。
Pd积。将RiPv2声明为“local”(确保不是全局变量)会有所不同
答案 0 :(得分:0)
因为所有的函数都在一个表中,所以“自我”参数对于Lua来说是强制性的,因此可以知道它的位置。
所有功能都不是必然表的一部分。 metatable允许您指定表a
中的查找可以解析为表b
中的查找,而这正是在此处所做的。
但我无法理解的是为什么尝试将表RIPv2中的函数覆盖到表o,我的意思是什么目标的行?:setmetatable(o,self))
o
是类的实例,它只包含实例数据。 方法存储在类对象Request
或Response
中。 metatable允许尝试索引o
以通过类对象解析。