|
Hi Gaspard,
I've been super-happy since about january using something
On Sat, Mar 26, 2011 at 12:10 PM, Gaspard Bucher <gaspard@teti.ch> wrote:
> Hi list !
> I am wondering if there is anything wrong when defining "classes" in this
> way (without using module):
> ======== file lk.Dir ===============================
> local lib = {sep = '/', ignore_pattern = '^[.]', type='lk.Dir'}
> lib.__index = lib
> lk.Dir = lib
> setmetatable(lib, {
> -- new method
> __call = function(table, arg)
> local instance = {path = arg}
> setmetatable(instance, lib)
> return instance
> end})
> -- private
> local function some_helper(self, x, y)
> -- ...
> end
> -- public
> function lib:glob(pattern)
> -- ...
> end
> --- etc
> ======== file lk.Dir ===============================
very similar to your idea:
Class = {
type = "Class",
__call = function (class, o) return setmetatable(o, class) end,
}
setmetatable(Class, Class)
otype = function (o) -- works like type, except on my "objects"
local mt = getmetatable(o)
return mt and mt.type or type(o)
end
Here's a demo:
Vector = Class {
type = "Vector",
__add = function (V, W) return Vector {V[1]+W[1], V[2]+W[2]} end,
__tostring = function (V) return "("..V[1]..","..V[2]..")" end,
__index = {
norm = function (V) return math.sqrt(V[1]^2 + V[2]^2) end,
},
}
v = Vector {3, 4} -- v = { 3, 4, __mt = Vector}
w = Vector {20, 30} -- w = {20, 30, __mt = Vector}
print(v) --> (3,4)
print(v + w) --> (23,34)
print(v:norm()) --> 5
print( type(v)) --> table
print(otype(v)) --> Vector
print( type("")) --> string
print(otype("")) --> string
For more information see:
http://angg.twu.net/blogme4/eoo.lua.html
http://angg.twu.net/dednat5/eoo.lua.html
Cheers,
Eduardo Ochs
eduardoochs@gmail.com
http://angg.twu.net/