NSE脚本 - 在表格函数中使用self的混淆

大家好,我正在尝试更好地理解基于Lua脚本的NSE脚本,但是与将函数作为表元素时使用语法有关的东西我无法理解。我将展示我在迷失中的脚本nmap / scripts / broadcast-rip-discver.nse的一部分:

RIPv2 = {

   --Request类包含构建RIPv2 Request的函数
   Request = {

       --创建新的Request实例
       --
       --@param command包含要使用的RIPv2命令的数字
       --@return o请求实例
       --省略代码(给表o赋值)
           
           setmetatable(o,selfself .__ index = self
           return o
       end--将整个请求转换为字符串
       __tostring = functionself-- --代码省略(覆盖元函数__tostring)
           return data
       end,

   },

   --响应类包含解析RIPv2响应所需的代码
   Response = {

       --基于原始套接字数据创建新的响应实例
       --
       --@param data包含原始套接字响应的字符串
       --@return o响应实例
       new = functionselfdatalocal o = {data = data}

           -- code省略(从数据中读取并将值传递给o)

           setmetatableoselfself .__ index = self
           return o
       end,

   }

}

从脚本的“操作”部分,我们有以下用法

local rip = RIPv2.Request:new(RIPv2.Command.Request)
local response = RIPv2.Response:new(data) - 数据已被分配一个值

我知道这类似于为这两行创建新的RIPv2表实例。由于所有函数都在一个表中(这不是类,因为Lua仅具有使事物类似但不相同的基本工具),因此“self”参数对于Lua具有到哪里放置的想法非常重要。

但是我无法理解为什么要尝试覆盖从表RIPv2到表o的函数,我的意思是目标是什么?: setmetatable(o,self))

我知道变量表o现在可能具有与RIPv2相同的函数以及它自己的值,但是这部分让我发疯了,我找不到Nmap的论坛直接回答。

P.d.使用“local”声明RiPv2的区别是什么(请确保它不是全局变量)

点赞
用户501459
用户501459

由于所有函数都在表格内部,所以 “self” 参数对于 Lua 来说是强制性的,才能确定其位置。

并不是所有函数都必须是表格的一部分。元表允许您指定在表格 a 中查找可以解析为表格 b 中的查找,这正是此处正在做的。

但是我不明白为什么要尝试覆盖来自表格 RIPv2 的函数到表格 o 中,我的意思是:这些线的目标是什么?(setmetatable(o, self))

o 是类的一个实例,它只包含实例数据。方法存储在类对象 RequestResponse 中。元表允许尝试通过类对象解析 o 索引。

请参阅《Lua 编程》中的类章节。

2013-02-19 23:49:12