作为一门脚本语言在arcmap中添加脚本语言——python,垃圾收集自然是必不可少的。Rust标准库中提供了自动引用计数Arc类型,着实让我眼馋了一会然后不得不放弃。如果通过Arc,使得每个对象直接保存其他对象的引用的话,这些引用就只能都是只读引用了——总不能要求一个对象最多只能被另外一个对象引用(仔细想了想好像也不是不能,但那实在太难理解了)。因此,我们还是需要一个内存池结构集中化地存储所有的对象。这样做的好处还有,我们可以更加自由地选择垃圾收集的算法,而不受限于引用计数。事实上,我最终所实现的第一版垃圾收集,是一个介于copy和mark-sweep之间的奇怪算法。
目前项目中包含的演示用main.rs内容如下:
extern crate shattuck;
use shattuck::core::memory::Memory;
use shattuck::objects::{DerivedObject, IntObject};
fn main() {
let mut mem = Memory::with_max_object_count(3);
// yukari = new DerivedObject()
let yukari = mem.append_object(Box::new(DerivedObject::new())).unwrap();
// age = new IntObject(18)
let age = mem.append_object(Box::new(IntObject(18))).unwrap();
// yukari.age = age
let key = "age".to_string();
mem.set_object_property(yukari, &key, age);
// print(yukari.age)
let age_prop = mem.get_object_property(yukari, &key);
println!("{:?}", age_prop);
println!("{:?}", mem.get_object(age_prop.unwrap()));
// marisa = new DerivedObject()
let marisa = mem.append_object(Box::new(DerivedObject::new())).unwrap();
mem.set_root(marisa);
// correct_age = new IntObject(4294967296)
let correct_age = mem.append_object(Box::new(IntObject(4294967296))).unwrap();
println!("{:?}", mem.set_object_property(yukari, &key, correct_age));
}
运行结果是
Some(Addr(1))
Some(IntObject(18))
garbage collected, 1 alive, 2 dead
None
由于mem中最多只允许3个对象存在,因此在我们尝试添加第4个对象correct_age时触发了垃圾收集,所有没有被根对象marisa引用的对象都被释放。所以说,这种事是做不得的……
最值得注意的是
mem.set_object_property(yukari, &key, age);
它是不能被写成
mem.get_object(yukari).set_property(&key, age);
的,因为get_object返回的是只读引用。事实上后期会把get_object方法藏起来,所有对属性的操作都要通过mem完成。
这篇文章原本计划对Memory类型 进行简单地描述以后结束,但是看起来已经有点太长了。祝愿各位阅读愉快。
目录
来源:【九爱网址导航www.fuzhukm.com】 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!