ヒント: 記事を作成した後、目次を自動的に生成できます。生成方法は、右側のヘルプドキュメントを参照してください。
序文
Tencentとのインタビューでホットアップデート、メタテーブル、メタメソッドを中心にLuaの内容について聞いたのですが、その穴を踏んだので記録として記事を書こうと思いました。
1. メタテーブル
この記事ではメタテーブルを紹介します, メタテーブル テーブルは Lua の唯一のデータ構造です. テーブルは私が使用するものに合わせて使用できます. クラス、継承、構造を実装できます. テーブルには任意の要素を追加できます.
t= {
a = 10,
b = 100,
c = "abc"
}
このテーブルは構造に少し似ています
2. メタメソッド
メタメソッドの存在により、メタテーブルが相互に対話できるようになり、メタメソッドを使用すると、割り当てられたメタテーブル間で特定の操作を実行できるようになります。
t = {
a = 10,
b = 100,
c = "abc"
}
mt = {
__add = function(a,b)
return a.a + b
end,
}
setmetatable(t, mt)
print(t + 2)
このうち mt はメタメソッドであり、setmetatable メソッドは mt 内のメソッドを t メタテーブルに代入することで t メソッドを操作することができます。lua ドキュメントはこちらです。メタメソッドの詳細な内容は lua ドキュメントにあります。個人的には callback に似ていると思います。own function
t = {
a = 10,
b = 4,
c = "abc",
__my = function(a,b)
return a + b
end
}
print(t.__my(t.a,t.b))
個人的な意見
私の意見では、lua は呼び出し側の役割です。スクリプト言語としての lua の最大の特徴は、コンパイルする必要がないため、各変更を再実行する必要がありません。この機能は、リリースされたゲームにとって非常に重要です。オンライン プロジェクトのすべての変更は、再度レビューする必要があります。lua を呼び出した後、コンパイルする必要のない機能により、多くの手間が省けます。バグを修正し、リソースをアップロードする必要があります。コンパイル不要と組み合わせることで、大量の deb を節約できます。アグタイム。
3、オブジェクト指向
メタテーブルとメタメソッドについて説明しましたが、メタテーブルをオブジェクトとみなして、メタメソッド内に関数を記述し、オブジェクトにメタメソッドを割り当てることでオブジェクト指向を完成させます。
bag = {}
bagmt = {--元方法
put = function(t,item)
table.insert(t.items,item)
end,
take = function(t)
return table.remove(t.items,item)
end,
list = function(t)
return table.concat(t.items,",")
end,
clear = function(t)
t.items = {}
end,
}
bagmt["__index"] = bagmt--这里是将index元方法赋予自己,作用是调用不存在的函数时会在bagmt里找
function bag.new()--构造函数
local t = {
items = {}
}
setmetatable(t,bagmt)
return t
end
local b = bag.new()
b:put("apple")
b:put(666)
b:put(1)
print(b:list())
ここから、コンストラクタを書いた後、コンストラクタ内で構築されたメタテーブルにメタメソッドを与えることで、テーブルがオブジェクトとなり、オブジェクト指向の操作が完了することがわかります。筆者は以前にC++を学習していましたが、ここでコンストラクタが実際に同じであることがわかります。コンストラクタが元の親クラスの場合、内部に関数を記述する必要がありますが、luaは外部に記述して代入し、結果は同じです。
オブジェクトが相互に対話する必要がある場合は、同じコンストラクターから生成され、対応するメタメソッドを記述する必要がある場合があります。
要約する
私の考えでは、Lua のデータ構造はメタテーブルだけですが、このデータ構造はクラスまたは構造体として使用でき、メタメソッドの呼び出し後に対応する操作関数を与えることもでき、メタテーブルをオブジェクトとして操作し、オブジェクト指向の操作を実現します。