|
Lua wrote:
*Lua list <lua@bazar2.conectiva.com.br <mailto:lua@bazar2.conectiva.com.br>> writes:*neither of these affect the C++ object that is wrapped by var1, var1 instead gets a new pointer to wrap (being a copy), and the old one is garbage-collected. If you want to modify the pointer that var1 wraps, then var1 needs to be involved in the function that does the assignment.True, I guess I was thinking more of a copy constructor than an overloaded operator.I guess a var1:CopyFrom() (or :Assign()) really is the best you can do then, sorry for the misinterpretation.Having said that, personally, I like the clarity of this over having to think every time I do A = B whether or not this is:- Make A refer to the same object that B refers to- Create a new object from B and assign a reference to it to A, overwriting the reference stored in A before. - A continues to refer to the same object as before but has had some of its internal fields tweaked such that they've been copied from B.Worse yet, if a metamethod were defined to do something like this, the rules could vary depending on the types of A and B.
as to whether that's worse, that's another debate.C++ has operator= , people familiar with C++ are used to the knowledge that something as simple as
A = Bneeds to be interpreted according to the types of A and B: if they are pointers, then A points to the object B did. If they are objects with an operator= defined, then that operator is called. If they are structures, then the compiler already generated a copy function for them that just copies all the members naively.
The thing with Lua, is that it is targeted as an extension language for apps.
That means that the target market for the lua language is people who wish to customise apps. This is customers - the general populace. The relatively non-techies, or at least non-programmers
So is it more intuitive, if you wish to copy an object, to write A=B, or is it more intuitive to write A.Assign(B), or B.CopyTo(A)?
IMO, someone that writes A = B wants A to be B, not A to be another reference to B (which is pretty much pointless, since you already have B).
writing a metamethod for this would then be an extension to the language to allow the developer to get the language to behave like they wish. By default the metamethod wouldn't be there, it would only be there by explicit design in specific cases, where it made obvious sense to do so.
James.
-- Adrien de Croy - WinGate Proxy Server - http://www.wingate.com