目次
1.ブログ紹介
この記事では、Luaの研究ノートとして、Luaメタテーブルの関連コンテンツについて説明します。主なコンテンツには、メタテーブルとは何か、メタテーブルの使用方法、およびいくつかのメタメソッドの目的が含まれます。知識ポイントは新人チュートリアルから抜粋したものです。 、および読者は、ルーキーチュートリアルのLuaメタデータの関連コンテンツに直接ジャンプできます。ブログ投稿の下部にポータルがあります。
2.コンテンツ
メタテーブルとは:
メタテーブルはテーブルです。このテーブルにはデフォルトのメタメソッド属性とカスタムメソッド属性があり、別のテーブルの説明として使用できます。このテーブルはメタテーブルと呼ばれます。
メタテーブルの役割:
mytable = {}
mymetatable = {}
テーブルmymetatableをmytableテーブルのメタテーブルとして設定すると、mytableは継承などのmymetatableのすべてのプロパティとメソッドを楽しむことができます。mytableでプロパティまたはメソッドを呼び出すと、見つからない場合は次のようになります。テーブル内を再度検索します。テーブルで算術演算が実行されると、メタテーブル内の関連するデフォルトのメタメソッドがトリガーされます。
メタテーブルの設定と取得:
mytable = {} -- 普通表
mymetatable = {} -- 元表
setmetatable(mytable,mymetatable) -- 把 mymetatable 设为 mytable 的元表
getmetatable(mytable) -- 这回返回mymetatable
mytable = setmetatable({},{})
setmetatableを使用して、テーブルを別のテーブルのメタテーブルとして設定できます。このメソッドは、mymetatableをメタテーブルとして持つテーブルを返すため、mytable = setmetatable({}、{})の形式に直接省略できます。また、getmetatableを渡してテーブルのメタテーブルを取得します。このメタテーブルはnilにすることができます。
テーブルとメタテーブル間のルックアップ関係:
mytable = {}
mymetatable = {}
setmetatable(mytable,mymetatable)
mymetatable.__index = mymetatable
mymetatable.key2 = 100
print(mytable.key2)
--------------------------输出
100
メタテーブルには、いくつかのデフォルトのメタメソッドといくつかの属性があります。これらのメソッド属性はすべて、2つの下のバー(__)で始まります。ここで、メタテーブルの最も重要なデフォルト属性は__indexです。__indexは任意のデータ型に設定できます。どちらの方法でもまたはテーブルを使用できます。ここでは、属性を呼び出した後に検索順序を強調する必要があります。上記のコードに示すように、mytableで属性key2を呼び出すと、mytableにkey2属性がないことがわかります。 mytableのメタテーブルmymetatableに移動してkey2を検索します。実際、key2を検索するのはmymetatable内ではなく、mymetatableの属性__indexにあるため、上記では__indexをmymetatable自体に設定して、属性key2を検索できるようにします。 mymetatableで
検索順序:
1.最初にmytableにkey2があるかどうかを確認し、存在する場合は返します
2. key2がmytableに存在しない場合は、最初にmytableにメタテーブルがあるかどうかを確認し、存在しない場合は終了します。
3. mytableにメタテーブルmymetatableがあり、mymetatableの__indexでkey2を検索し、存在する場合は戻り、存在しない場合は終了します。
メタメソッドの目的:
local mytable1 = {1,2,3}
local mytable2 = {4,5,6}
print(mytable1 + mytable2)
上記のコードに示すように、通常の状況では、2つのテーブルに対して加算、減算、乗算、除算の操作を直接実行することはできず、エラーが報告されますが、メタテーブルがある場合、メタテーブル内の一部のメタメソッドは次のようになります。演算子が検出されたときにトリガーされます。たとえば、+メソッドはメタテーブルの__addメソッドをトリガーします。
local mytable1 = {1,2,3}
local mytable2 = {4,5,6}
mymetatable = {}
setmetatable(mytable2,mymetatable)
function mymetatable:__add(table1,table2)
return 1
end
print(mytable1 + mytable2)
-------------------------输出
1
上記のコードに示すように、テーブルとテーブルの加算動作がある場合は、テーブルに追加順にメタテーブルがあるかどうかを判断します。メタテーブルがある場合は、メタメソッド__addがあるかどうかを判断します。メタテーブルを呼び出してから、最初に見つかった__addメソッドを呼び出すと、__ addメソッドに戻り値があります。メタテーブルがない場合、またはメタテーブルに__addメソッドがない場合、コンパイルは失敗します。計算に関連するメタメソッドを以下に示します。 、および操作に関連しないメタメソッドの一部の読者は、新人チュートリアルを参照できます。
__追加 | 対応する演算子「+」。 |
__サブ | 対応する演算子「-」。 |
__私が持っています | 対応する演算子「*」。 |
__div | 対応する演算子「/」。 |
__モッド | 対応する演算子 '%'。 |
__unm | 対応する演算子「-」。 |
__concat | 対応する演算子「...」。 |
__eq | 対応する演算子 '=='。 |
__lt | 対応する演算子「<」。 |
__the | 対応する演算子 '<='。 |
3.プッシュ
Github:https://github.com/KingSun5
初心者チュートリアルLuaメタテーブル:https://www.runoob.com/lua/lua-metatables.html
4.結論
メタテーブルにはさまざまな機能があります。その1つは、シミュレーションオブジェクト指向として継承を実装することです。このブログはここにあります。ブロガーの記事がうまく書かれていると感じた場合は、ブロガーに注意を払うことをお勧めします。 、ブログ投稿のように、そして別のブログ。主な能力は限られています。記事に間違いがあれば、コメントして批判することを歓迎します。
QQ交換グループ:806091680(中国人)
このグループは、CSDNブロガーのChinarによって作成されました。お勧めします。私もグループにいます!