import
import 用于引入一个新的模块或者插件,其本质是一种语法糖。如下代码所示,下面的两个代码是基本等价的(细节上略有差别,假定example.gs放在指定的根目录下):
import example;
example.func();
基本等价于
"/example.gs".func();
import 在导入时,会按照一定规则查找到对应的文件路径,并得到一个等价于字符串常量(内容为导入文件的路径,以'/'开头)的标识符。也正因为此,如下的代码是可以工作的。
import example;
//...
object obj_1 = new_object(example, this_domain());
// example 是一个字符串常量,其内容为"/example.gs"
//...
当调用模块中的函数时,模块会发生 load_static。
// example.gs
void create()
{
printf("example Instance.\n");
}
public string func()
{
return "Helloworld";
}
// src.gs
import example;
printf("Now test: %s\n" ,example);
printf("%s\n", example.func());
// 此处等效于
// printf("%s\n", load_static(example, this_domain()).func());
printf("%s\n", example.func());
运行src.gs得到:
Now test: /example.gs
example Instance.
Helloworld
Helloworld
总而言之,利用import,可以在另外的脚本中封装一些操作,将之整体import进来,然后调用其中的方法。
import别名
import import_name 在导入模块时,可在其后添加 as alias_name,其将 alias_name 视为 import_name 的别名,除部分别名冲突的情况下,两者的使用是等效的。如下代码所示:
import example as example_alias;// example_alias 作为 example的别名
example.func();
example_alias.func(); //等效于 example.func()
信息
当alias_name与已有 变量,import_name, 关键字,其他别名 冲突时,其表现如下:
- 与已有变量名冲突时,该冲突别名在变量的作用域内被视为变量,作用域外则可正常作为别名使用。
import example as example_alias;// example_alias 作为 example的别名
if(true)
{
int example_alias = 0;
example.func();
example_alias = 1; //在变量作用域内example_alias为int变量
}
example.func();
example_alias.func(); //在变量作用域外example_alias正常作为别名
- 与已有的 import_name 冲突,使用该冲突名称时,报错"Ambiguous import name ..."
import example_alias;
import example as example_alias;// example_alias作为别名与已导入的模块名冲突
example.func();
//example_alias.func(); 使用 example_alias 时会报错"Ambiguous import name ..."
- 与已有关键字冲突时,关键字的优先级更高,此时别名无法作为import_name 使用。
import example as while;
import example1 as if;
// while.func(); while 无法作为 import_name 使用
// if.func(); if 无法作为 import_name 使用
- 有不同文件对应相同的别名时,使用该冲突名称时会导致"Ambiguous import name"错误。
import example0 as example_alias;
import example1 as example_alias;
//example_alias.func(); 使用 example_alias 时会报错"Ambiguous import name