美好的一天,我正在尝试了解更多基于 Lua 的 NSE 脚本,但是在将函数用作表中的元素时,我无法理解与语法相关的一些内容。我将展示我迷路的部分脚本 nmap/scripts/broadcast-rip-discover.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
我知道为这两行创建 Table RIPv2 的新实例是“相似的”。由于所有函数都在一个表内(这不是一个类,因为 Lua 只有基本工具可以使事物相似但与类不同)所以“自我”参数对于 Lua 来说是强制性的,知道该放在哪里。
但是我不明白为什么要尝试覆盖从表 RIPv2 到表 o 的函数,我的意思是目标有什么行?: setmetatable(o, self) )
我知道变量表 o 现在可以具有与 RIPv2 将他自己的值组合在一起的相同功能,但这部分让我抓狂,我在 Nmap 的论坛上找不到直接的答案。
Pd 这将是用“本地”声明 RiPv2 的区别(确保这不是全局变量)