lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]

On 02/05/2011 10.49, Eike Decker wrote:
> 2011/5/2 Lorenzo Donati<>:
>> I know that I could either:
>> 1) generate an unique ID with a custom algorithm
>> 2) upon creation, before attaching the metatable to the object being
>> created, call tostring on the object and store the ID in a (weak?) table. >> 3) use a proxy and return the ID of the "private" object instead (preserves >> uniqueness because of the 1-to-1 relationship between proxies and objects)
> You can modify 1) a bit to make it less performance critical:
> do
> local idcnt = 0
> local idcache = setmetatable({},{__mode='k',__index = function(t,k)
> idcnt = idcnt + 1 t[k] = idcnt return idcnt end})
> function getid (o) return idcache[o] end
> end
> So this would only affect performance for debug code that tags objects
> if you take a look at them.

Nice technique.
I think Hisham's suggestion suits my needs better, but this technique is really worth remembering for future reference. Interesting way of implementing lazy initialization using the subtleties of metamethods call sequence.

> Aside from this, I don't know any other trick. Well, you could also
> erase the metatable, get the string and restore the original metatable
> again.

Well, I thought of this, but it seemed a bit drastic approach to me. I feared it could have some nasty side effects. Just a feeling, though - the only downside of erasing the metatable of which I can think in a rational way is something related to what Mike Pall mentioned in another thread: IIRC there is some form of caching for metatables/metamethods, so erasing the metatable could maybe thrash the cache.

I still feel the metatable of an object is something to be left alone once set whenever possible, but I must admit that maybe this is only an irrational feeling due to my past experience on "static" languages like C++/Java.

> And besides all that: You could look into the Lua code and find out,
> how the table:#xxx code looks like and provide it as additional
> function if you have access on the C API. E.g. table.getpointerid

Well, I'm not completely unaware of C, but I don't feel competent enough to tinker with the bowels of Lua. I wrote a couple of toy extensions using Lua C API, just to play with the API and refresh my C knowledge, but I really prefer a pure Lua solution. I feel on much safer ground there.

> Cheers,
> Eike
Thanks for the suggestions.