美文网首页
aardio教程四) 理解名字空间(namespace)

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

作者: Python成长路 | 来源:发表于2024-04-01 17:40 被阅读0次

名字空间(namespace)

文档地址: https://bbs.aardio.com/doc/reference/the%20language/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"]

相关文章

  • 名字空间(namespace)

    意义 对于一个较大型的C++程序来说,需要由多个程序员相互协作编写,这样的情况下容易出现不同程序员在需要负责的程序...

  • 命名空间(namespace)

    命名空间,也称名称空间,名字空间。命名空间是用来组织和重构代码的。如同名字一样的意思,NameSpace(名字空间...

  • 在Python中 作用域与命名空间的坑

    1. 命名空间 1.1 什么是命名空间 Namespace命名空间,也称名字空间,是从名字到对象的映射。Pytho...

  • [C++11阅读][2-5-1]内联名字空间

    inline namespace C++11新增的内联名字空间要解决的问题是,在父名字空间定义或特化子名字空间的模...

  • C#输入输出,类型转换,冒泡排序

    using System;//引入系统空间 //命名空间(理解为省份)namespace C_NO//自己的、定义...

  • 什么是QName。

    来历:qname是qualified name的简写 构成:由名字空间(namespace)前缀(prefix)以...

  • 文件系统分布式锁介绍

    1 命名空间 不同服务的锁用不同的namespace来区分,不同元数据服务上锁namespace的名字不同,元数据...

  • 2018-04-22 PHP命名空间

    解决名字冲突问题使名字更加简单清晰 通过namespace关键字建立 命名空间必须建立在程序开头 命名空间之前不能...

  • 命名空间(有待完善)

    命名空间 namespace亦称名称空间、名字空间,用于组织和重用代码。解决了不同的人写的程序变量重名的问题。例如...

  • (一)基础篇--要点日记

    命名空间 使用namespace的时候有四种不同的访问方式的写法: 1)将using namespace std;...

网友评论

      本文标题:aardio教程四) 理解名字空间(namespace)

      本文链接:https://www.haomeiwen.com/subject/fcyitjtx.html