aardio 文档

aardio 命名空间

什么是命名空间

命名空间组织、归类、标识一组具名对象的名字,是模块化编程的重要基础。

打开或创建命名空间

aardio 使用 namespace 语句打开或创建命名空间。 如果同名的命名空间已存在则直接打开,否则创建新的命名空间。

命名空间的本质是一个表(table)对象,但 namespace 语句不会触发表的元方法。

使用 dotNet.import 函数导入的 .NET 命名空间依赖元方法按需加载,因此必须用 with 语句替代 namespace 语句创建 .NET 命名空间。 对于已创建的 .NET 命名空间,则可以直接使用 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 与 self 命名空间

  1. global #

global 为默认的全局命名空间,当aardio代码文件加载时,默认都运行在 global 命名空间。

  1. self #

self 表示当前命名空间。

默认的命名空间为 global,也就是说 self 默认指向 global。

import 语句 #

import 语句可以将外部命名空间导入当前命名空间(并且总是会同时导入全局命名空间)。

标准库通常都是将外部命名空间导入到 global 命名空间,并且在非全局命名空间中使用 .. 操作符访问其他全局命名空间。

//自  console 库导入 console 命名空间
import console;

//定义新的命名空间
namespace namespaceName{

    //非全局命名空间使用  .. 操作符访问其他全局命名空间。
    ..console.log("调用导入的 console 库函数")
}

console.pause();

如果导入未定义的命名空间,import 语句会尝试自库文件导入命名空间。
aardio 库文件的物理路径与命名空间路径保持一致,对于模块化编程提供良好的支持。

注意:命名空间不能是单个下划线(可以包含下划线)! aardio 使用 _.aardio 文件创建库目录下的默认库,除此之外 aardio 不建议在库命名空间中使用任何下划线。如果在 IDE 中右键创建库或改动库名,aardio 将会自动移除下划线。如果您一定要在库名字中包含下划,则必须在资源管理器中手动改名。

请参考: import

with 语句 #

with 语句用于将一个表达式返回的 table 对象绑定为当前命名空间,with 语句执行结束释放绑定。命名空间作用域为当前函数体(以及内部函数),单个代码文件属于匿名函数。

with 语句必须执行完成(没有中途跳出)才能恢复当前函数命名空间。

示例:

import console; 

var tab = {}

with tab{
    name = "测试";
    ..console.log(name);
}

console.logPause( tab.name ) 

Markdown 格式