Luaのテーブル要素(メタテーブル)2024 年の最新の入門チュートリアル。このコースでは __index要素法,__newindex要素法,テーブルの演算子を追加します。,__call要素法,__toString要素法, について学習できます。
Luaのテーブルでは、値を取得するには、対応するキーの値にアクセスすることができますが、それは2テーブルの上に動作させることはできません。
したがって、Luaがテーブル要素(メタテーブル)を提供し、テーブルには、私たちは、対応する要素法に関連した各アクションの動作を変更することができます。
例えば、メタテーブルを用いて、我々は、Luaのテーブルは、2つの操作+ bの和を計算する方法を定義することができます。
Luaの試みは2つのテーブルを追加する場合は、最初と呼ばれる場所があるかどうかを確認した後、フィールド、見つかった場合は、対応する値を呼び出す "__add"、2元表の1があるかどうかを確認してください。 "__add"そして、他のインスタントフィールド、対応する値(多くの場合、関数またはテーブル)」要素法」です。
元のテーブルを処理するために2つの非常に重要な機能があります。
次の例では、指定したテーブル要素のテーブルを設定する方法を示しています。
mytable = {} -- 普通表 mymetatable = {} -- 元表 setmetatable(mytable,mymetatable) -- 把 mymetatable 设为 mytable 的元表
上記のコードは、行に直接書き込むことができます。
mytable = setmetatable({},{})
以下は、リターン・オブジェクトのメタデータ表のとおりです。
getmetatable(mytable) -- 这回返回mymetatable
これは、最も一般的に使用されるメタテーブルのキーです。
あなたがテーブルにアクセスするためのキーを渡すと、キーに値がない場合は、Luaは__indexキーに(メタテーブルを想定)メタテーブルのテーブルがあります。 __indexは、テーブルが含まれている場合は、Luaはテーブル内の対応するキーを検索します。私たちは、対話モード・ビューを入力するのluaコマンドを使用することができます。
$ lua Lua 5.3.0 Copyright (C) 1994-2015 Lua.org, PUC-Rio > other = { foo = 3 } > t = setmetatable({}, { __index = other }) > t.foo 3 > t.bar nil
__indexが関数が含まれている場合は、その後、Luaがその関数を呼び出します、テーブルとキーは関数にパラメータとして渡されます。
テーブル要素が存在するビュー、そうでない場合は、結果を返すために__index要素法はnilであり、それは__index戻り結果によって存在している場合。
mytable = setmetatable({key1 = "value1"}, { __index = function(mytable, key) if key == "key2" then return "metatablevalue" else return nil end end }) print(mytable.key1,mytable.key2)
出力の例は次のとおりです。
value1 metatablevalue
分析の例:
mytableはテーブル割り当てられた{キー1 = "値1"}。
mytableはセットのメタテーブル要素法__index。
mytableは表にKEY1を検索、見つかった場合、その要素を返し続け、見つけることができません。
mytableはテーブル内のキー2を検索し、見つかった場合は、metatablevalueを返し、続け見つけます。
メタテーブルを分析すること__index方法が関数の場合、関数を呼び出す、全く__index方法がありません。
私たちは、上記のコードは単純です書くことができます。
mytable = setmetatable({key1 = "value1"}, { __index = { key2 = "metatablevalue" } }) print(mytable.key1,mytable.key2)
Luaのルックアップは、実際には、ときに、次の3つの手順をtable要素をルール:
__newindex要素法は、テーブルを更新するために使用され、__インデックスは、テーブルにアクセスするために使用されます。
あなたが不足しているインデックステーブルの割り当てを与えるときは、インタプリタは__newindex要素法を見ていきます:あなたは割り当てなしでこの関数を呼び出した場合。
次の例では、アプリケーション__newindex要素法を示しています。
mymetatable = {} mytable = setmetatable({key1 = "value1"}, { __newindex = mymetatable }) print(mytable.key1) mytable.newkey = "新值2" print(mytable.newkey,mymetatable.newkey) mytable.key1 = "新值1" print(mytable.key1,mymetatable.key1)
上記の出力の実装の例としては、次のとおりです。
value1 nil 新值2 新值1 nil
要素法__newindexを設定上記の表の例として、ときに新しいインデックスキー(NEWKEY)代入(mytable.newkey = "新しい値2」)は、割り当てなしの要素のメソッドを呼び出します。 既存のインデックスキー(キー1)場合、要素法の__newindexを呼び出さず、割り当てを行います。
次の例では、表を更新するrawset機能を使用しています。
mytable = setmetatable({key1 = "value1"}, { __newindex = function(mytable, key, value) rawset(mytable, key, "\""javalueja"\"") end }) mytable.key1 = "new value" mytable.key2 = 4 print(mytable.key1,mytable.key2)
上記の出力の実装の例としては、次のとおりです。
new value "4"
次の例では、2つのテーブルの追加操作を示しています。
-- 计算表中最大值,table.maxn在Lua5.2以上版本中已无法使用 -- 自定义计算表中最大值函数 table_maxn function table_maxn(t) local mn = 0 for k, v in pairs(t) do if mn < k then mn = k end end return mn end -- 两表相加操作 mytable = setmetatable({ 1, 2, 3 }, { __add = function(mytable, newtable) for i = 1, table_maxn(newtable) do table.insert(mytable, table_maxn(mytable)+1,newtable[i]) end return mytable end }) secondtable = {4,5,6} mytable = mytable + secondtable for k,v in ipairs(mytable) do print(k,v) end
上記の出力の実装の例としては、次のとおりです。
1 1 2 2 3 3 4 4 5 5 6 6
表に含まれる重要な要素を__add、および操作を追加します。 次の表に対応するアクションのリスト:
モード | 説明 |
---|---|
__add | 対応するオペレータ '+'。 |
__sub | 対応するオペレータ ' - '。 |
__mul | 対応するオペレータ '*'。 |
__div | 対応するオペレータ '/'。 |
__mod | 対応するオペレータ '%'。 |
__unm | 対応するオペレータ ' - '。 |
__concat | 対応するオペレータ 'ja'。 |
__eq | 対応するオペレータ '=='。 |
__lt | 対応するオペレータ '<'。 |
__le | 対応するオペレータ '<='。 |
Luaが値を呼び出したときに__call要素メソッドが呼び出されます。 次の例では、要素の計算テーブルを示し、そして:
-- 计算表中最大值,table.maxn在Lua5.2以上版本中已无法使用 -- 自定义计算表中最大值函数 table_maxn function table_maxn(t) local mn = 0 for k, v in pairs(t) do if mn < k then mn = k end end return mn end -- 定义元方法__call mytable = setmetatable({10}, { __call = function(mytable, newtable) sum = 0 for i = 1, table_maxn(mytable) do sum = sum + mytable[i] end for i = 1, table_maxn(newtable) do sum = sum + newtable[i] end return sum end }) newtable = {10,20,30} print(mytable(newtable))
上記の出力の実装の例としては、次のとおりです。
70
__toString要素法は、出力テーブルの動作を変更するために使用されます。 コンテンツの当社のカスタム出力テーブルの例を示します。
mytable = setmetatable({ 10, 20, 30 }, { __tostring = function(mytable) sum = 0 for k, v in pairs(mytable) do sum = sum + v end return "表所有元素的和为 " ja sum end }) print(mytable)
上記の出力の実装の例としては、次のとおりです。
表所有元素的和为 60
この記事から、我々は良いが、私たちのコードの機能を簡素化することが可能な素子のテーブルを知っているので、Luaのメタテーブルを理解することは、私たちは単純な優れたLuaのコードを記述することができますすることができます。