[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Extending C++ classes under Lua
- From: Javier Guerra <javier@...>
- Date: Sat, 16 Sep 2006 11:05:21 -0500
On Friday 15 September 2006 11:51 pm, Don Hopkins wrote:
> One question I have about Lua OOP in general is: why (in the examples on
> the Wiki) is there both a metatable, and also a separate method table
> (which the metatable points to with its __index attribute)? This seems
> kind of wastefully JavaScripty, and not as minimally Selfish as I'd
> expect. Is there any reason not to put methods and class variables
> directly into the metatable, and dispense with the extra method table in
> the metatable's __index attribute?
the metatable is not a "if not found search here" attribute, it's a table with
well-defined slots to define several special behaviours. one of them is
creating table-like access for other objects (or extending it for real
tables). that is the __index slot. it can be a function or a table. if it's
a table, then its easy to use as an inheritance mechanism; but this is
_only_one_ use case. there are other ways to use metatables for other
things.
if you want, you can set __index to point to the metatable itself. you
wouldn't be the first to prefer this setup:
mt={}
mt.__index=mt
setmetatable (obj, mt)
personally, i usually set two tables, one is the metatable, and the other is
the methods table. that is, when i bother to use OOP. my typical factory
function is something like this:
function newthing ()
return setmetatable ({}, {__index = {
meth1 = function (params)
<code>
end,
meth2 = function (params)
<code>
end,
}})
end
note that this creates a new metatable and methods table for each object, so
it's only OK if you create a few very-long-lived instances
more frequent is the library-like class:
local thing_mths={}
local thing_mt={__index=thing_mths}
function thing_mths:method1 (params..)
<code>
end
function thing_mths:method2 (params..)
<code>
end
function newthing ()
return setmetatable ({}, thing_mt)
end
(note that you could replace the first two lines to put the methods in the
metatable)
of course, none of these handle inheritance. so far i haven't missed it.
after 15 years of C++ i've found that most simple problems don't need it, and
most complex problems should use only a bit... the biggest exception seems
to be GUIs, still haven't find anything better than a big C++ framework for
that
of course, if you want a generic tool to bind Lua with C++, you'll have to
handle inheritance, i just wanted to show some usual idioms from the Lua side
of things
--
Javier
Attachment:
pgpXCyxGUBrzZ.pgp
Description: PGP signature