[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
**Subject**: **Re: Gotchas in math metamethods etc**
**From**: Dirk Laurie <dpl@...>
**Date**: Sun, 13 Mar 2011 09:56:34 +0200

On Sun, Mar 13, 2011 at 07:15:20AM +0200, HyperHacker wrote:
> Something I stubbed my toe on the other day:
> > obj={val=2}
> > meta={}
> > function meta:__mul(num) return self.val * num end
> > setmetatable(obj, meta)
> > =obj*4
> 8
> > =4*obj
> stdin:1: attempt to index local 'self' (a number value)
> stack traceback:
> stdin:1: in function <stdin:1>
> stdin:1: in main chunk
> [C]: ?
> While this makes perfect sense, it seems like something that's likely
> to give a hard time to newbies who don't realize why the second
> statement fails ('self' is actually 4). I was just thinking this
> should be noted in the manual to avoid that potential confusion.
This particular mistake has little to do with Lua.
I suppose that you are looking for a vector space structure, otherwise
you would have coded the possibility of multiplying two objects. Now
in a vector space, you are supposed always to write scalars on one
pre-chosen side of vectors when you multiply. Left is usual, but right
is equally possible and in fact preferred by some authors. Whatever,
you would expect one of scalar*vector and vector*scalar to be valid
and the other invalid.
Which is exactly what you found.
Dirk