翼度科技»论坛 编程开发 python 查看内容

aardio教程四) 理解名字空间(namespace)

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
名字空间(namespace)

文档地址: https://bbs.aardio.com/doc/reference/the%20language/namespace.html
引入namespace的作用是为了解决变量命令冲突,比如有两个人都叫张三,一个是江西的,一个是北京的。为了区分他们就可以在名字前面加个地区比如江西.张三和北京.张三,这样你就知道具体是哪一个了。
默认的名字空间

在aardio中默认的名字空间是global, 当你运行一个文件时,就会把里面的变量和代码放到global名字空间里。
使用import语句可以将某个名字空间也放到global或其他名字空间里,这样你就能在这个名字空间里使用它。
这就好像是aardio先给了你一个初始的容器(global),你可以往里面写代码或者放其他容器,其他容器里又可以放其他容器。
而global本质上也是一个table,定义的函数和导入的其他名字空间都是global的成员,可以像表一样使用global。
  1. import console;
  2. global["console"].dump(type(global))
  3. global.console.log("hello world")
  4. console.pause()
复制代码
  1. import console;
  2. func1 = function(){
  3.         console.log("func1 call")
  4. }
  5. global["func1"]()
  6. console.pause()
复制代码
注意: var定义的为局部变量,它不会放到对应的名字空间里。
  1. import console;
  2. var func1 = function(){
  3.         console.log("func1 call")
  4. }
  5. console.dump(global["func1"]) // 打印null
  6. console.pause()
复制代码
动态导入名字空间

可以使用global.import来导入字符串给定的名字空间
  1. global.import("console")
  2. global["console"].dump(console)
  3. console.log("aaaaaa")
  4. console.pause()
复制代码
名字空间外的变量

我在lib下创建了一个文件module.aardio,里面的代码如下:
  1. func = function(){
  2.         console.log("aaaaaaaaaaa")
  3. }
  4. namespace module{
  5.       
  6. }
复制代码
上面的代码将func函数定义在module外了,那它属于哪个名字空间呢?也是global。
但是你如果不导入module名字空间的话,你是无法使用func这个函数的,比如:
  1. import console
  2. func() //报错
  3. console.pause()
复制代码
当你导入module时它才能使用
  1. import console
  2. import module
  3. func()
  4. console.pause()
复制代码
我估计是import aaa导入一个模块时,会先查找是否有一个文件或目录的名称是aaa,然后将aaa定义的一些全局变量(不用var修饰的)、全局函数和名字空间放到global里。
如果你想在module里使用func,需要在前面加..,表示访问global里的成员,当然你如果不嫌麻烦的话使用global["func"]也是可以的
库代码里import一般会放在名字空间外,然后在用..来访问
  1. import console;
  2. namespace module{
  3.    ..console.log("aaaaaa")
  4. }
复制代码
因为console已经被导入到global里,你导入module也可以用console
不过不建议这么做,多次导入并不会出现重复导入的情况,所以最好是写多个import避免出错
  1. import module;
  2. console.log("aaaaaa")
  3. console.pause()
复制代码
在namespace里导入的名字空间也会放一份到global里,比如module里的代码是下面的,上面的代码依然可以执行
  1. namespace module{
  2.     import console;
  3.     console.log("aaaaaa")
  4. }
复制代码
global

其实aardio中的名字空间就是用table来实现的,导入一个名字空间,就是往table里添加了一个键值对,键是名字空间的名称,值则是另一个table(名字空间)。
为了验证这一点,我们可以在导入一个名字空间后,删除掉这个键,看看这个名字空间还能不能被使用。
  1. import console
  2. global["console"] = null
  3. console.log("aaaaaaaa") // 报错。显示console已经是null了
  4. console.pause()
复制代码
self

self表示当前名字空间,如果在global下,self === global是成立的。它的作用应该是你想用字符串调用名字空间里的函数时会使用,比如self["func"]。
本文由博客一文多发平台 OpenWrite 发布!

来源:https://www.cnblogs.com/kanadeblisst/p/18111157
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具