0

美好的一天,我正在尝试了解更多基于 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 的区别(确保这不是全局变量)

4

1 回答 1

0

由于所有函数都在表内,因此 Lua 必须知道“self”参数的位置。

所有函数不一定是表的一部分。元表允许您指定 table 中的查找a可以解析为 table 中的查找b,这正是这里所做的。

但是我不明白为什么要尝试覆盖从表 RIPv2 到表 o 的函数,我的意思是目标有什么行?: setmetatable(o, self) )

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

请参阅关于类的 Lua 编程章节。

于 2013-02-19T23:49:12.790 回答