表作用域块 |
|
A = {}
using A in
foo = 5;
bar = "Hello World";
end
write(A.foo, A.bar) -- Will print out "5Hello World"
这样做基本方法是在块(block)内部用表作用域(table scope)替换全局作用域。因为这是一个块,所以它保证了全局作用域永远不会丢失。
这在 Lua 的面向对象实现中可能很有用,可以更好地利用 self。如果你把 self 引入作用域,那么它会再次变得更像“C”一样。
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
或许可以完成这个示例,以确切地展示如何设置标签。
这将需要使用函数标签(function tag),其中一个使用块(using block)被放置在实际函数调用周围。
这在创建 Lua 包时也可能有所帮助。在 Python 中,如果一个模块使用全局作用域,它实际上是访问模块字典中的变量。稍加修改,就可以通过一个“using..in”块来实现相同的效果。
还有一个问题是,这如何与上述关于假定变量为局部变量的建议配合使用。
2. 我觉得在 C++ 等语言中,你无法看到一个标识符是类成员还是全局变量,这非常令人恼火。你必须查看类定义。写 self.x 清楚地表明访问的是一个字段而不是全局变量。我同意这一点。许多 C++ 程序员甚至使用 m_... 前缀来声明所有成员变量,以便在使用时清楚地表明正在访问成员变量。--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