AngelScript SDK: dictionary讲解

DinS          Written on 2018/4/17

本文介绍AS里SDK的dictionary,其作为数据结构在AS中的地位与dictionary在python中的地位相当。确保你理解object handle的概念,见《AngelScript高级概念:object handle与OOP》。

AS的dictionary跟python的dictionary非常类似,也是键值对,key是string,value可以是任何类型包括handle。所以我估计作者也会用python。
在代码中注册dictionary,然后看看基本功能。

大图点这里

写法简单明了,需要注意的是取出数据时的类型问题。
因为dict可以存储任意类型的数据,所以取出时必须指定类型,这样编译器才知道如何处理内存。对于基本类型,使用强制转化即可。
[]使得书写可以大大简化,set方法基本上用不到。

运行以上脚本,结果:

符合预期,接下来看看装载handle,这个才是dict真正强大的地方。

大图点这里

有几点要注意:
一是存储handle必须显式加上@,因为dict既可以装value又可以装handle,所以必须明确一些。
二是获取的handle实际上指向dict里面的值,因此改变handle就是改变dict里面的对象。
三是需要用到cast来将handle转成需要的类型,当然也有get不过写起来麻烦点。另外既然用到了cast安全起见需要检查合法性。

运行结果:

符合预期,hunger从5变成了2。(这个Dog类来自上篇文章)

dictionary里面还可以放dictionary,接着上面的例子。

大图点这里

由于dictionary自身可以变成handle,所以可以放到dictionary里。只不过取出值的时候写法有些麻烦,在python里可以直接dictEx[“OneDict”][“first”],不过AS提供的dict不能做到这样,只能是一层层cast。
为了增进理解,把获取array里的值也写成这样。
阅读起来是把cast<>()整体当作一个handle,然后后面的[]是作用于这个handle的。
顺带一句string + 数值可以自动变成string。

运行结果:

1是dict里first键的值,2.2是array里面的值,符合预期。

因为获取深层次node写起来麻烦,所以用dictionary的话尽量不要深入过多,而且最好单独取出handle再操作,这样更容易理解。

至此有关angelscript的内容就告一段落了,如果读者感兴趣可以做一些扩展阅读,即个人推荐的脚本与程序交互方式,见《脚本与程序交互推荐方式:json解析》和《脚本与程序交互推荐方式:json去格式化》。