对象(object)
在GS中,对象(object)是一个包含有成员变量和方法的模块。在编写.gs
文件时,实际上就是在描述一个对象的原型
。
object可以从文件中加载(使用load_static加载原型
),也可以通过原型创建出新的object副本(使用new_object)。
与其他面向对象语言中的对象不同的是,object的变量是无法从外部访问的。开发者需要在object中提供接口函数。其他地方的程序能够访问这些函数来对object进行操作。
- P.S.
- 需要特别注意的是,GS的object被设计用于表达一个较大规模的、拥有较长生命周期的数据和方法集合,绝大多数情况下创建出的object并不会立即被回收。因此出于性能考虑,GC不会对object做频繁的检测,GS中的对象在创建之后 必须 手动调用destruct_object方法进行回收,否则可能存在内存的浪费,严重情况下可能导致内存资源耗尽引发的崩溃。
- 如果需要一个类 似object、不需要手动释放的“对象”,请尝试使用map或者新版本GS的class_map。
object例子简单讲解
前文中已经提到,load_static
可以用于从文件中加载object的原型:
import .example;
// ...
example.xxxx(); // 这个操作也将会尝试 load_static example
object origin_obj_2 = load_static("./example.gs", this_domain());
object origin_obj_1 = load_static(example, this_domain());
// ...
若 load_static 正在首次加载原型,那么这份文件就会被编译并最终生成一个原型
object,此后对相同文件进行 load_static 都将直接返回这份原型。如上代码中,由于example
和"./example.gs"
实际上是相同的文件,因此 origin_obj_1 与 origin_obj_2 会是同一个object。
加载完对象原型之后,可以通过 new_object 函数创建一个新的对象:
object new_obj_1 = new_object(example, this_domain());
object new_obj_2 = new_object("./example.gs", this_domain());
object new_obj_3 = new_object(origin_obj_1, this_domain());
new_object 会根据传入的参数1,找到原型
来创建对象,因此上述三个 new_object 创建的都是example
对象。
在对象的创建(load_static & new_object)过程中,会自动地依次调用 ::entry
和 create()
来对对象进行初始化操作。可以通过手动声明 create
函数的方式让对象在创建时执行一些初始化逻辑。
在对象(因为GC或手动关闭)销毁时,会调用 destruct
函数。
example.gs
void create(string msg)
{
// create 函数 *最多* 可以传入 *一个* 构造参数
// 参数在 load_static 或 new_object 时传入。
printf("On create: %s.\n", msg);
}
void destruct()
{
printf("On destruct.\n");
}
printf("On ::entry.\n");
source.gs
import .example;
load_static(example, this_domain(), "load_static()");
new_object(example, this_domain(), "new_object()");
destruct_object(example);
输出结果:
On ::entry.
On create: load_static().
On ::entry.
On create: new_object().
On destruct.
比较完整的例子:
obj.gs
int count = 0;
void create()
{
write("Create an object\n");
}
private void sub_count() // 私有函数作用:count - 1
{
count --;
write("count == ", count, "\n"); // 输出 count
}
public void add_count() // 公有函数作用:count + 1
{
count ++ ;
write("count == ", count, "\n"); // 输出 count
}
public int get_count() // 获取count的值
{
return count;
}
test.gs
object obj1 = load_static("obj.gs",this_domain()); // 此时执行create(), 输出 "Create an object", count = 0
obj1.add_count(); // count = count + 1 = 1
write(obj1.get_count()); // 输出 1
obj1.?sub_count(); // .?调用,如果函数不存在于对象也不会报错。此处因为调用私有函数,所以不执行也不报错
write(obj1.get_count()); // 还是输出 1