Lua élément de table (MetaTable)
Dans le tableau Lua, nous pouvons accéder à la valeur de clé correspondante pour obtenir la valeur, mais il ne peut pas fonctionner sur deux tables.
Par conséquent, Lua fournit un élément de table (MetaTable), table nous permet de changer le comportement de chaque action associée à la méthode des éléments correspondant.
Par exemple, en utilisant la table de méta, nous pouvons définir la façon dont la table Lua pour calculer la somme des deux opérations a + b.
Lorsque tentative Lua ajoutant deux tables, d'abord vérifier s'il y a une des deux tables de yuans, après avoir vérifié que il y a un endroit appelé "__add champ", se trouve, puis d'appeler la valeur correspondante. "__add" Et un autre domaine instantanée, la valeur correspondante (souvent une fonction ou une table) est la «méthode Element."
Il y a deux fonctions très importantes pour gérer la table de yuans:
- SetMetaTable (table, métatable): mettre la table pour l'élément de table spécifié (métatable), si __metatable table élément clé (métatable) dans, SetMetaTable échouer.
- getmetatable (tableau): Retourne la table objet de métadonnées (de métatable).
L'exemple suivant montre comment définir la table pour l'élément de table spécifié:
mytable = {} -- 普通表 mymetatable = {} -- 元表 setmetatable(mytable,mymetatable) -- 把 mymetatable 设为 mytable 的元表
Le code ci-dessus peut être écrit directement à la ligne:
mytable = setmetatable({},{})
Suite à la table sont retour objet de métadonnées:
getmetatable(mytable) -- 这回返回mymetatable
__index Element Method
Ceci est la clé métatable le plus couramment utilisé.
Lorsque vous passez la clé pour accéder à la table, et si la clé n'a pas de valeur, alors Lua trouverez la table des métatable (en supposant métatable) dans la clé de __index. Si __index contient une table, Lua trouvera la clé correspondante dans la table.Nous pouvons utiliser la commande lua pour entrer en mode interactif Vues:
$ 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
Si __index contient une fonction, puis, Lua appeler cette fonction, une table et des touches sera passé en paramètre à la fonction.
méthode des éléments __index pour afficher l'élément de table existe, sinon, renvoie le résultat est nul, si elle existe par __index résultats de retour.
mytable = setmetatable({key1 = "value1"}, { __index = function(mytable, key) if key == "key2" then return "metatablevalue" else return nil end end }) print(mytable.key1,mytable.key2)
Des exemples de sortie est:
value1 metatablevalue
Des exemples d'analyse:
Tableau mytable attribué{key1 = "valeur1"}.
mytable ensemble méta tableau méthode des éléments __index.
Trouver key1 dans la table mytable, si elle est trouvée, le retour de cet élément ne peut être trouvé, continuer.
Trouver key2 dans la table mytable, si elle est trouvée, retourner metatablevalue, retrouvez continué.
L'analyse de méta tableau n'a pas de méthode de __index, si __index méthode est une fonction, appelez la fonction.
- méthode Element pour vérifier si entrant "key2" touche de paramètre (mytable.key2 set), si le "key2" retours de paramètres "metatablevalue" entrant, touche correspondante autrement mytable.
Nous pouvons écrire le code ci-dessus est simple:
mytable = setmetatable({key1 = "value1"}, { __index = { key2 = "metatablevalue" } }) print(mytable.key1,mytable.key2)
résumé
Lua recherche des règles d'un élément de table quand, en fait, les trois étapes suivantes:
- 1. Trouver dans le tableau, si elle est trouvée, retourner cet élément, non trouvé, continuer
- 2. déterminer si la table a une table de RMB, s'il n'y a pas de table table d'éléments, le rendement nul, il est poursuivi dollar.
- 3. Analyse méta tableau n'a pas de méthode de __index, si __index méthode est nul, le retour nul; si __index méthode est une table, répétez 1,2,3, si __index méthode est une fonction, la fonction retourne la valeur de retour.
__newindex Element Method
méthode des éléments __newindex est utilisé pour mettre à jour la table, __ index est utilisé pour accéder à la table.
Quand vous donnez une affectation de table d'index manquant, l'interprète se penchera __newindex Element Method: Si vous appelez cette fonction sans affectation.
L'exemple suivant illustre l'application de la méthode des éléments:
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)
Des exemples de mise en oeuvre du résultat ci-dessus est la suivante:
value1 nil 新值2 新值1 nil
Des exemples des tableaux ci-dessus fixées méthode des éléments __newindex, lorsque la nouvelle clé d'index (newkey) affectation (mytable.newkey = "nouvelle valeur 2"), va appeler la méthode des éléments sans affectation. Et si une clé d'index existant (key1), sera chargée de la mission, sans faire appel à la méthode des éléments __newindex.
L'exemple suivant utilise la fonction rawset pour mettre à jour la table:
mytable = setmetatable({key1 = "value1"}, { __newindex = function(mytable, key, value) rawset(mytable, key, "\""..value.."\"") end }) mytable.key1 = "new value" mytable.key2 = 4 print(mytable.key1,mytable.key2)
Des exemples de mise en oeuvre du résultat ci-dessus est la suivante:
new value "4"
Ajouter opérateur pour la table
L'exemple suivant montre deux tables ajoutent le fonctionnement:
-- 计算表中最大值,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
Des exemples de mise en oeuvre du résultat ci-dessus est la suivante:
1 1 2 2 3 3 4 4 5 5 6 6
__add élément clé contenue dans le tableau, et ajoutez l'opération. Une liste d'actions correspondant au tableau suivant:
mode | description |
---|---|
__add | opérateur correspondant '+'. |
__sub | opérateur correspondant '-'. |
__mul | opérateur correspondant '*'. |
__div | opérateur correspondant '/'. |
__mod | opérateur correspondant 'de%'. |
__unm | opérateur correspondant '-'. |
__concat | opérateur correspondant '..'. |
__eq | opérateur correspondant '=='. |
__lt | opérateur correspondant '<'. |
__le | opérateur correspondant '<='. |
__call Element Method
méthode des éléments __call est appelée lorsque Lua appelle une valeur. L'exemple suivant illustre le tableau de calcul des éléments, et:
-- 计算表中最大值,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))
Des exemples de mise en oeuvre du résultat ci-dessus est la suivante:
70
__toString Element Method
Méthode élément __toString est utilisé pour modifier le comportement de la table de sortie. Les exemples suivants de notre table de sortie personnalisé du contenu:
mytable = setmetatable({ 10, 20, 30 }, { __tostring = function(mytable) sum = 0 for k, v in pairs(mytable) do sum = sum + v end return "表所有元素的和为 " .. sum end }) print(mytable)
Des exemples de mise en oeuvre du résultat ci-dessus est la suivante:
表所有元素的和为 60
De cet article, nous pouvons savoir Table Element peut être une bonne simplifier notre fonction de code, de sorte que la compréhension Lua méta tableau nous permet d'écrire plus simple code excellent Lua.