在arcmap中添加脚本语言——python 用Rust写脚本语言(一):一切存在皆对象

09/11 11:38:32 来源网站:辅助卡盟网

作为一门脚本语言在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】 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

SQL Error: select * from ***_ecms_game where title like '%在arcmap中添加脚本语言——python 用Rust写脚本语言(一):一切存在皆对象%' or INSTR('在arcmap中添加脚本语言——python 用Rust写脚本语言(一):一切存在皆对象',title)>0 order by newstime desc limit 10

游戏推荐

更多>
    SQL Error: select * from ***_ecms_game where titlepic<>'' order by newstime desc limit 6