姓名空间(namespace)
文档地址: https://bbs.aardio.com/doc/reference/the language/namespace.html
引入namespace的效果是为了处理变量指令冲突,比方有两个人都叫张三,一个是江西的,一个是北京的。为了区分他们就能够在姓名前面加个地区比方江西.张三
和北京.张三
,这样你就知道详细是哪一个了。
默认的姓名空间
在aardio中默认的姓名空间是global
, 当你运行一个文件时,就会把里边的变量和代码放到global姓名空间里。
运用import语句能够将某个姓名空间也放到global或其他姓名空间里,这样你就能在这个姓名空间里运用它。
这就好像是aardio先给了你一个初始的容器(global),你能够往里边写代码或者放其他容器,其他容器里又能够放其他容器。
而global本质上也是一个table,定义的函数和导入的其他姓名空间都是global的成员,能够像表一样运用global。
import console;
global["console"].dump(type(global))
global.console.log("hello world")
console.pause()
import console;
func1 = function(){
console.log("func1 call")
}
global["func1"]()
console.pause()
注意: var定义的为局部变量,它不会放到对应的姓名空间里。
import console;
var func1 = function(){
console.log("func1 call")
}
console.dump(global["func1"]) // 打印null
console.pause()
动态导入姓名空间
能够运用global.import
来导入字符串给定的姓名空间
global.import("console")
global["console"].dump(console)
console.log("aaaaaa")
console.pause()
姓名空间外的变量
我在lib下创建了一个文件module.aardio
,里边的代码如下:
func = function(){
console.log("aaaaaaaaaaa")
}
namespace module{
}
上面的代码将func函数定义在module外了,那它属于哪个姓名空间呢?也是global
。
但是你假如不导入module姓名空间的话,你是无法运用func这个函数的,比方:
import console
func() //报错
console.pause()
当你导入module时它才干运用
import console
import module
func()
console.pause()
我估计是import aaa
导入一个模块时,会先查找是否有一个文件或目录的称号是aaa,然后将aaa定义的一些大局变量(不用var修饰的)、大局函数和姓名空间放到global里。
假如你想在module里运用func,需求在前面加..
,表明访问global里的成员,当然你假如不嫌费事的话运用global["func"]
也是能够的
库代码里import一般会放在姓名空间外,然后在用..来访问
import console;
namespace module{
..console.log("aaaaaa")
}
由于console已经被导入到global里,你导入module也能够用console
不过不建议这么做,多次导入并不会出现重复导入的状况,所以最好是写多个import防止出错
import module;
console.log("aaaaaa")
console.pause()
在namespace里导入的姓名空间也会放一份到global里,比方module里的代码是下面的,上面的代码仍然能够履行
namespace module{
import console;
console.log("aaaaaa")
}
global
其实aardio中的姓名空间就是用table来完成的,导入一个姓名空间,就是往table里添加了一个键值对,键是姓名空间的称号,值则是另一个table(姓名空间)。
为了验证这一点,咱们能够在导入一个姓名空间后,删除去这个键,看看这个姓名空间还能不能被运用。
import console
global["console"] = null
console.log("aaaaaaaa") // 报错。显现console已经是null了
console.pause()
self
self表明当时姓名空间,假如在global下,self === global
是成立的。它的效果应该是你想用字符串调用姓名空间里的函数时会运用,比方self["func"]
。