0

こんにちは、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

これらの2つの回線に対してテーブルRIPv2の新しいインスタンスを作成することは「類似」していることを理解しています。すべての関数はテーブル内にあるため(Luaには、クラスと同じものを作成するための基本的なツールしかないため、クラスではありません)、Luaに必須の「自己」引数は、その場所を特定する必要があります。

しかし、私が理解できないのは、なぜテーブルRIPv2からテーブルoに関数をオーバーライドしようとするのか、つまり、目的が何であるかという行を意味しますか?:setmetatable(o、self))

変数テーブルoは、RIPv2が自分の値を一緒にするのと同じ関数を持つことができることを理解していますが、この部分は私を夢中にさせ、Nmapのフォーラムで正解を見つけることができません。

RiPv2を「ローカル」で宣言する場合の違いとなるPd(グローバル変数でないことを確認してください)

4

1 に答える 1

0

すべての関数はテーブル内にあるため、「self」引数は、Luaがそれをどこに配置するかについてのアイデアを持っているために必須です。

すべての関数が必ずしもテーブルの一部であるとは限りません。aメタテーブルを使用すると、テーブル内のルックアップがテーブル内のルックアップに解決できることを指定できますb。これはまさにここで行われていることです。

しかし、私が理解できないのは、なぜテーブルRIPv2からテーブルoに関数をオーバーライドしようとするのか、つまり、目的が何であるかという行を意味しますか?:setmetatable(o、self))

oクラスのインスタンスであり、インスタンスデータのみが含まれます。メソッドはクラスオブジェクトRequestまたはに格納されますResponseoメタテーブルを使用すると、クラスオブジェクトを介してインデックスを作成して解決できます。

クラスに関するLuaでのプログラミングの章を参照してください。

于 2013-02-19T23:49:12.790 に答える