一、名字空间简介
名字空间是当前所有公用变量的默认环境表。
我们默认在_G名字空间下工作,所以前有全局变量都可以写成_G.变量名字 或者 _G["变量名字"];
大家使用过很多标准库的函数吧,
例如string就是一个名字空间,而string.left string.right等等函数都是string名字空间的成员。
名字空间可以很好的组织代码,不同的名字空间存在同名的成员变量或成员函数时,将能有效的避免名字污染。
我们做一个通俗的比喻
张 = _G; --我们估且让_G全局变也姓张吧
张.老三的家 = { 小强=0;小强弟弟=0 }; --这是"张老三的家",是一个table对象
张.老三的家.小强 = 110; --"张老三的家"又可以作为"张小强"的名字空间
张.老三的家.小强弟弟 = 119; --"老三的家"又可以作为"张小强弟弟"的名字空间
--可是这样写很复杂了,每个变量都要写太多的前缀.所以我们需要用namespace函数改变当前的默认名字空间
namespace("张.老三的家"); --改变当前的默认的名字空间,好比进入张老三的家里
小强 = 110; --LAScript会自动加上默认的前缀成为 张.老三的家.小强
小强弟弟 = 119;
下面介绍如何使用namespace函数进入新的名字空间。
namespace(ns,[tab[func]]...)指定或创建新的名字空间,
ns参数是一个字符串,指定名字空间的名字,可以用.来分隔多层名次空间。
如果名字空间不存在则创建新的名字空间. 如果名字空间已存在但是不是table对象则抛出命名冲突错误
然后将这个名字空间指定为当前作用域的默认名字空间。
可以在ns函数后面可以添加任意多个参数,当然也可以省略
如果参数为table类型(只能有一个这样的参数),名字空间将会继承这个table的所有成员(你只)
如果添加func参数,将会自动调用这个函数,并将当前创建的名字空间作为参数传递给这个函数。
例如代码: namespace("ns.ns2",_G);
创建一个ns.ns2名字空间,并作为当前作用域内所有变量的默认名字空间.
并且添加了一个table类型的参数_G. 如果在当前名字空间找不到成员会自动到_G中去查找成员并添加到当前名字空间.
例如代码: namespace("ns.ns2",func);
创建一个ns.ns2名字空间,并且执行函数 func(ns.ns2); func实际上是名字空间的构造函数。
我们随时可以用 namespace("名字空间的名字") 进入任意的名字空间。
1、创建名字空间
用namespace创建的名字空间默认有以下属性
2、给namespace添加参数
LAS脚本库:如果用外部LAS文件创建名字空间,这个LAS文件称为LAS脚本库.
可以使用LAScript自行编写,官方也会提供一些脚本库,例如std脚本库.
DLL插件库:如果使用外部DLL插件创建名字空间,这个DLL文件称为DLL插件库.
通常由官方提供(与普通的DLL动态链接库不同).
使用import函数导入外部LAS脚本库或者DLL插件库。
import(ns);--ns参数指定名字空间,ns参数同时也指明文件的路径。
例如 import("aa.bb");
import按以下顺序搜索
1、搜索文件顺序
2、搜索目录顺序(?代替文件名称)
首先搜索LAS脚本库
当前目录 + ?.LAS;
脚本目录 + ?.LAS
小精灵插件目录(如果有) + Fairy_Ape\import\?.LAS
模拟精灵目录 + ?.LAS
模拟精灵插件目录 + Fairy_Ape\import\?.LAS;
如果没有找到文件,就继续搜索DLL插件库
小精灵插件目录(如果有) + Fairy_Ape\import\?.dll;
模拟精灵插件目录 + Fairy_Ape\import\?.dll;
脚本目录 + ?.dll
模拟精灵目录 + ?.dll
当前目录 + ?.dll
如果没有找到文件,就继续搜索标准库libs.dll
小精灵插件目录(如果有) + Fairy_Ape\import\libs.dll
模拟精灵插件目录 + Fairy_Ape\import\libs.dll
五、示例