Table Scope Blocks |
|
A = {} using A in foo = 5; bar = "Hello World"; end write(A.foo, A.bar) -- Will print out "5Hello World"
The basic method for doing this is replacing the global scope with a table scope while in the block. Since this is a block, it guarantees that global scope will never be lost.
This could be useful in OO implementation in Lua, to make better use of self. If you put self in scope, then it would be more "C" like again:
function A:foo(x) local y bar = x -- Sets self.bar to x [and where comes x from? --ET] y = x -- Sets local variable y self.y = x -- Sets self.y end
Could probably complete this example to show exactly how to set the tags
This would require the use of the function tag, where a using block is placed around the actual function call.
This may also help when creating Lua packages. In python, if a module uses global scope, it actually accesses variables in the module dictionary. With a little work, the same effect could be created with a "using..in" block.
There's also the question of how this will work with the above recommendation that variables be assumed local.
2. I find it pretty annoying in i.e. C++ that you cannot see whether an identifier is class member or a global. You have to look up the class definition. Writing self.x makes it clear that a field instead of a global is accessed. I have to agree here. Many C++ Programmers even use the convention to declare all member variables beginning with m_... to make it clear that when it is used, a membervariable is accessed. --PeterPrade
--ET
tab = { tab2={ x=3 } } do local t = tab.tab2 print (t.x) t.x = 4 end print (t) -- nil as out of scope now
--NDT