こんにちは、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(グローバル変数でないことを確認してください)