介绍
这篇文章描述了如何在君土脚本里使用命名空间来组织你的代码. 在组织方面,命名空间对于在全局作用域内对逻辑上相关的对象和类型进行分组是很便利的。 通过将类型有层次地组织在命名空间里,可以方便用户找到与使用那些类型。
命名空间对解决全局作用域里命名冲突来说是很重要的。 比如,你可以有一个我的.应用.客户.增加表单
和我的.应用.订单.增加表单
– 两个类型的名字相同,但命名空间不同。
第一步
我们先来写一段程序并将在整篇文章中都使用这个例子。 我们定义几个简单的字符串验证器,假设你会使用它们来验证表单里的用户输入或验证外部数据。
所有的验证器都放在一个文件里
型 字串验证器 {
可接受乎(字0: 文): 两;
}
常 字母则式 = /^[A-Za-z]+$/;
常 数字则式 = /^[0-9]+$/;
类 仅字母验证器 具 字串验证器 {
可接受乎(文字: 文) {
回 字母则式.测试(文字);
}
}
类 邮政编码验证器 具 字串验证器 {
可接受乎(文字: 文) {
回 文字.长 === 5 && 数字则式.测试(文字);
}
}
// 一些用来尝试的内容
定 字符串数组 = ["nihao", "98052", "101"];
// 使用的验证器
定 验证器: { [文字: 文]: 字串验证器; } = {};
验证器["邮政编码"] = 启 邮政编码验证器();
验证器["只有字母"] = 启 仅字母验证器();
// 显示每个字符串是否通过验证器
为 (定 字符串 在 字符串数组) {
为 (定 名称 于 验证器) {
定 是匹配 = 验证器[名称].可接受乎(字符串);
控制台.日志(`'${字符串}' ${是匹配 ? "匹配" : "不匹配"} '${名称}'.`);
}
}
命名空间
随着更多验证器的加入,我们需要一种手段来组织代码,以便于在记录它们类型的同时还不用担心与其它对象产生命名冲突。 因此,我们把验证器包裹到一个命名空间内,而不是把它们放在全局命名空间下。
下面的例子里,把所有与验证器相关的类型都放到一个叫做验证
的命名空间里。 因为我们想让这些接口和类在命名空间之外也是可访问的,所以需要使用出
。 相反的,变量字母则式
和数字则式
是实现的细节,不需要导出,因此它们在命名空间外是不能访问的。 在文件末尾的测试代码里,由于是在命名空间之外访问,因此需要限定类型的名称,比如验证.仅字母验证器
。
使用命名空间的验证器
名 验证 {
出 型 字串验证器 {
可接受乎(字0: 文): 两;
}
常 字母则式 = /^[A-Za-z]+$/;
常 数字则式 = /^[0-9]+$/;
出 类 仅字母验证器 具 字串验证器 {
可接受乎(文字: 文) {
回 字母则式.测试(文字);
}
}
出 类 邮政编码验证器 具 字串验证器 {
可接受乎(文字: 文) {
回 文字.长 === 5 && 数字则式.测试(文字);
}
}
}
// 一些用来尝试的内容
定 字符串数组 = ["nihao", "98052", "101"];
// 使用的验证器
定 验证器: { [文字: 文]: 验证.字串验证器; } = {};
验证器["邮政编码"] = 启 验证.邮政编码验证器();
验证器["只有字母"] = 启 验证.仅字母验证器();
// 显示每个字符串是否通过验证器
为 (定 字符串 在 字符串数组) {
为 (定 名称 于 验证器) {
定 是匹配 = 验证器[名称].可接受乎(字符串);
控制台.日志(`'${字符串}' ${是匹配 ? "匹配" : "不匹配"} '${名称}'.`);
}
}
别名
另一种简化命名空间操作的方法是使用引 短名 = 甲.乙.丙
给常用的对象起一个短的名字。 不要与用来加载模块的引 甲 = 需('模块名称')
语法弄混了,这里的语法是为指定的符号创建一个别名。 你可以用这种方法为任意标识符创建别名,也包括导入的模块中的对象。
名 形状 {
出 名 多边形 {
出 类 三角形 { }
出 类 正方形 { }
}
}
引 多边形 = 形状.多边形;
定 正方形 = 启 多边形.正方形(); // 等同于 "启 形状.多边形.正方形()"
注意,我们并没有使用需
关键字,而是直接使用导入符号的限定名赋值。