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


作用:

  在名字空间内部定义的对象名字由名字空间管理。引用外部名字空间的名字时需要在对象名字前添加名字空间前缀。不同的名字空间中可以有相同的名字而互不干扰,有效的避免了名字污染。一个名字空间可以包含另一个名字空间,名字之间使用成员操作符“.”连接,称为名字空间路径。主要目的是用来组织和重用代码。

  名字空间,顾名思义,就是叫这个名字的一个目录,不同的名字里,可能会有相同的功能,如console下有open功能,io下也有open功能。可以看做是一个个不同的目录。所以,名字空间叫web.layout.debug,对应的目录就是web\layout\debug\。这样就代表,使用一个功能,先把他所在的根目录import进来,他的根目录就成了这个代码中的namespace,然后通过.来逐次的找到对应的目录下,使用这个函数。函数就是把预先写好的功能封装起来,作用对象用一个形式上的代号先占位一下,这个代号叫做形参,用的时候通过(),在括号内把实际要这个封装好的功能要操作的对象传进去就可以用了。然后这个括号内的实际内容会给到功能里,代替形参的位置来运行。


定义名字空间语法:

namespace NAME {

//成员,名字内部空间代码

}

名字空间内可以嵌套名字空间,访问方式为“名字空间.内部名字空间.成员”,内嵌的名字空间内的功能,要访问顶层名字空间要使用..操作符。“..”作为前缀,则该名字空间为全局名字。


例如:

namespace 某学校{

    namespace 一年级 {

        namespace 一班{

            班长 = "张宇" 

        }

    }

    namespace 二年级 {

        namespace 一班{

            班长 = "王宇" 

        }

    }

}

如果在二级一班中要调用一年纪一班的张宇,要用:

..console.log(global.某学校.一年级.一班.班长),要调用自己当前的变量班长,可以用self.班长,其中self可以省略。

为什么要在console前面加两个..

原因:所有的代码,首先都是被包含在一个global内。在global名字空间中包含的其他名字空间,不管是定义的还是import进来的,要想用global空间的变量或功能,都要通过“global.变量”名来引用。其中,global可以省略为两个点。

============================================================

特殊的名字空间:global和self:

1、global

global为默认的全局名字空间,当aau代码文件加载时,默认都运行在global名字空间。所有的代码,首先都是被包含在一个:

namespace global{

    ……

}
之内的

2、self

self表示当前名字空间。


变量的默认名字空间为global名字空间,并可以使用namespace改变指定代码块的名字空间。可以使用self关键字访问当前名空间。使用..操作符访问global名字空间。



=============================================================

import方式导入库文件。


标准库与内核库:


wKioL1c1coSDH04gAAiHHT7MIa4713.png




最后,用一个例子来解释一下名字空间、成员变量、局部变量的关系

import console;
 
num= "最外面";
namespace list {
	
	num = "中间成员变量"
	var num = "最里面局部变量"
	
	..console.log("如下:")
	..io.print(self.num,num,global.num)
	
}
console.pause(true);


以上代码输出结果是:


中间成员变量 最里面局部变量 最外面


原因是:

self.num 是当前名字空间的成员变量, 而var语句声明的是局部变量。var的作用域是其的右下方。成员变量就相当于list.num 最外面的就相当于global.num,是全局名字空间。如果这里不用namespace,则self.num 和 global.num 相同,因为不做namespace定义的时候,当前名字空间默认是全局名字空间。

语句块有独立的局部变量作用域,语句块内部的局部变量拥有最高存取优先级。

语句块有独立的局部变量作用域,语句块内部的局部变量拥有最高存取优先级。
aardio根据标志符查找对象的顺序依次为:

1.当前语句块局部变量。

2.上层语句块局部变量(upvar)。

3.当前名字空间(self)成员变量。