J'ai cette question, à propos de Lua metatables. J'ai entendu et regardé, mais je ne comprends pas comment les utiliser et pour quoi. Les métadonnées sont des fonctions qui sont appelées dans certaines conditions.Comment fonctionnent les métabalises et à quoi servent-elles?
Répondre
Prenez l'index metatable "__newindex" (deux caractères de soulignement), lorsque vous affectez une fonction à cette fonction, cette fonction sera appelée chaque fois que vous ajoutez un nouvel index à une table, comme;
table['wut'] = 'lol';
Ceci est un exemple de métabalier personnalisé utilisant '__newindex'.
ATable = {}
setmetatable(ATable, {__newindex = function(t,k,v)
print("Attention! Index \"" .. k .. "\" now contains the value \'" .. v .. "\' in " .. tostring(t));
end});
ATable["Hey"]="Dog";
la sortie:
Attention! L'index "Hey" contient maintenant la valeur "Chien" dans la table: 0022B000
Les métabaliers peuvent également être utilisés pour décrire comment les tables doivent interagir avec d'autres tables et différentes valeurs.
Ceci est une liste de tous les indices possibles MetaTable vous pouvez utiliser
* __index(object, key) -- Index access "table[key]".
* __newindex(object, key, value) -- Index assignment "table[key] = value".
* __call(object, arg) -- called when Lua calls the object. arg is the argument passed.
* __len(object) -- The # length of operator.
* __concat(object1, object2) -- The .. concatination operator.
* __eq(object1, object2) -- The == equal to operator.
* __lt(object1, object2) -- The < less than operator.
* __le(object1, object2) -- The <= less than or equal to operator.
* __unm(object) -- The unary - operator.
* __add(object1, object2) -- The + addition operator.
* __sub(object1, object2) -- The - subtraction operator. Acts similar to __add.
* __mul(object1, object2) -- The * mulitplication operator. Acts similar to __add.
* __div(object1, object2) -- The/division operator. Acts similar to __add.
* __mod(object1, object2) -- The % modulus operator. Acts similar to __add.
* __tostring(object) -- Not a proper metamethod. Will return whatever you want it to return.
* __metatable -- if present, locks the metatable so getmetatable will return this instead of the metatable and setmetatable will error.
J'espère que cela efface les choses, si vous avez besoin d'autres exemples, click here.
Ils permettent des tables à traiter comme d'autres types tels que chaînes, fonctions, etc. numéros
Pour un haut niveau, divertissant lire vérifier le modèle prototype sur http://steve-yegge.blogspot.com/2008/10/universal-design-pattern.html. Cela peut vous aider avec le «quoi».
Merci. = D Et vous pouvez aussi utiliser metatable pour faire avancer votre script? – StudioMARIO
Ouais, vous pourriez deviner. Bien que je serais plus intéressé par quelque chose qui fait une tâche plus complexe. – Anonymous
Notez que votre exemple appartient à l'utilisateur. Sauf si vous faites 't [k] = v' quelque part dans le métaméthode' __newindex', la valeur ne sera pas dans la table. –