表作用域块

lua-users home
wiki

在 Pascal 中,有一种技术可以将记录中的数据成员置于作用域中。我建议我们也这样做,使用类似这样的结构

A = {}

using A in
    foo = 5;
    bar = "Hello World";
end

write(A.foo, A.bar) -- Will print out "5Hello World"

实现此方法的基本方法是在块中用表作用域替换全局作用域。由于这是一个块,它保证全局作用域永远不会丢失。

这在 Lua 中的 OO 实现中可能很有用,可以更好地利用 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

可能可以完成此示例以准确显示如何设置标签

这将需要使用函数标签,其中使用块放置在实际函数调用周围。

这在创建 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


最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于 2007 年 7 月 7 日下午 8:22 GMT (差异)