表作用域块

lua-users home
wiki

在 Pascal 中有一种将记录(record)中的数据成员引入作用域的技术。我提议我们也这样做,使用如下结构:

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”块来实现相同的效果。

还有一个问题是,这如何与上述关于假定变量为局部变量的建议配合使用。


1. 当“using”激活时,如何访问全局作用域?在 C++ 或 Pascal 等类型化语言中,编译器知道哪些标识符是全局的或类/结构成员,并生成相应的代码。Lua 不知道……

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


RecentChanges · preferences
编辑 · 历史
最后编辑于 2007 年 7 月 7 日下午 2:22 GMT (diff)