NSE脚本 - 在表的功能上使用self的困惑

时间:2013-02-19 16:30:42

标签: lua

美好的一天,我正在尝试理解更多基于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”(确保不是全局变量)会有所不同

1 个答案:

答案 0 :(得分:0)

  

因为所有的函数都在一个表中,所以“自我”参数对于Lua来说是强制性的,因此可以知道它的位置。

所有功能都不是必然表的一部分。 metatable允许您指定表a中的查找可以解析为表b中的查找,而这正是在此处所做的。

  

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

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

See the Programming in Lua chapter on classes.