J'ai trouvé quelques endroits sur le web disant que les opérateurs de Lua sont surchargeables mais je n'arrive pas à trouver d'exemple. Est-ce que quelqu'un peut donner un exemple de surcharger l'opérateur + pour qu'il fonctionne comme l'opérateur .. fonctionne pour la concaténation de chaînes?
Lua Operator Overloading
EDIT 1: Alexander Gladysh et RBerteig:
Si l'opérateur surcharge ne fonctionne que lorsque les deux opérandes sont du même type et de changer ce comportement ne serait pas facile, alors comment se fait les travaux de code suivant ? (Je ne veux pas une infraction, je viens de commencer l'apprentissage de cette langue):
printf = function(fmt, ...)
io.write(string.format(fmt, ...))
end
Set = {}
Set.mt = {} -- metatable for sets
function Set.new (t)
local set = {}
setmetatable(set, Set.mt)
for _, l in ipairs(t) do set[l] = true end
return set
end
function Set.union (a,b)
-- THIS IS THE PART THAT MANAGES OPERATOR OVERLOADING WITH OPERANDS OF DIFFERENT TYPES
-- if user built new set using: new_set = some_set + some_number
if type(a) == "table" and type(b) == "number" then
print("building set...")
local mixedset = Set.new{}
for k in pairs(a) do mixedset[k] = true end
mixedset[b] = true
return mixedset
-- elseif user built new set using: new_set = some_number + some_set
elseif type(b) == "table" and type(a) == "number" then
print("building set...")
local mixedset = Set.new{}
for k in pairs(b) do mixedset[k] = true end
mixedset[a] = true
return mixedset
end
if getmetatable(a) ~= Set.mt or
getmetatable(b) ~= Set.mt then
error("attempt to 'add' a set with a non-set value that is also not a number", 2)
end
local res = Set.new{}
for k in pairs(a) do res[k] = true end
for k in pairs(b) do res[k] = true end
return res
end
function Set.tostring (set)
local s = "{"
local sep = ""
for e in pairs(set) do
s = s .. sep .. e
sep = ", "
end
return s .. "}"
end
function Set.print (s)
print(Set.tostring(s))
end
s1 = Set.new{10, 20, 30, 50}
s2 = Set.new{30, 1}
Set.mt.__add = Set.union
-- now try to make a new set by unioning a set plus a number:
s3 = s1 + 8
Set.print(s3) --> {1, 10, 20, 30, 50}
Cela est vrai pour les opérateurs de comparaison - pas pour les opérateurs habituels. La surcharge pour ajouter à la fois une table et une chaîne, par exemple, est parfaitement valide. – Puppy