命名空间组织、归类、标识一组具名对象的名字,是模块化编程的重要基础。
.连接为完整的命名空间路径。aardio 使用 namespace 语句定义命名空间。
如果一个不存在的变量首次被赋值( var 语句声明的局部变量除外),则会自动加入到当前命名空间。
请参考:赋值语句
定义命名空间语法:
namespace namespaceName{
//命名空间内部代码
}
命名空间可以嵌套,默认每个 namespace 语句总是在当前命名空间内部创建新的命名空间,如下:
namespace namespaceName1{
namespace namespaceName2{
//命名空间内部代码
}
}
namespaceName1.namespaceName2.member = 123
命名空间也可以省略语句块标记,表示命名空间作用域直至该代码文件结束:
namespace namespaceName
//命名空间内部代码,命名空间的作用域直到文件结束
在 aardio 中每个命名空间都是独立的,创建命名空间后,访问全局命名空间的对象必须显式加上 .. 前缀,例如:
namespace myNamespace{
..print("访问全局对象必须加上 .. 前缀。")
}
上面的 ..print 等价于 global.print,注意 .. 后面不能出现空白字符。
定义命名空间时也可以使用 .. 作为前缀,以表示在全局命名空间而不是当前命名空间之内创建新的命名空间,如下:
import console;
namespace namespaceName{
namespace ..globalNamespaceName{
//命名空间内部代码
member = 123
}
}
console.log( globalNamespaceName.member );
console.pause(true);
要点:
.. 操作符。global 为默认的全局命名空间,当aardio代码文件加载时,默认都运行在 global 命名空间。
self 表示当前命名空间。
默认的命名空间为 global,也就是说 self 默认指向 global。
import 语句可以将外部命名空间导入当前命名空间(并且总是会同时导入全局命名空间)。
标准库通常都是将外部命名空间导入到 global 命名空间,并且在非全局命名空间中使用 .. 操作符访问其他全局命名空间。
//自 console 库导入 console 命名空间
import console;
//定义新的命名空间
namespace namespaceName{
//非全局命名空间使用 .. 操作符访问其他全局命名空间。
..console.log("调用导入的 console 库函数")
}
console.pause();
如果导入未定义的命名空间,import 语句会尝试自库文件导入命名空间。
aardio 库文件的物理路径与命名空间路径保持一致,对于模块化编程提供良好的支持。
注意:命名空间不能是单个下划线(可以包含下划线)! aardio 使用 _.aardio 文件创建库目录下的默认库,除此之外 aardio 不建议在库命名空间中使用任何下划线。如果在 IDE 中右键创建库或改动库名,aardio 将会自动移除下划线。如果您一定要在库名字中包含下划,则必须在资源管理器中手动改名。
请参考: import
with 语句用于将一个表达式返回的 table 对象绑定为当前命名空间,with 语句执行结束释放绑定。命名空间作用域为当前函数体(以及内部函数),单个代码文件属于匿名函数。
with 语句必须执行完成(没有中途跳出)才能恢复当前函数命名空间。
示例:
import console;
var tab = {}
with tab{
name = "测试";
..console.log(name);
}
console.logPause( tab.name )