2019独角兽企业重金招聘Python工程师标准>>>

vobject

neko 中对象是一种优化的hash表,在虚拟机中类型映射的值是 4 ,数据内部在存储的时候和lua中的table结构上有些不同,不能共享解复用.对象的所有key被散列成整数叫做id类型(field ->int),表的键值可以通过id快速查找. 插入一个字段和数据的复杂度是O(n) 访问一个字段的复杂度是O(log n) . 原型:

typedef struct _vobject {val_type t;objtable table;struct _vobject *proto;
} vobject;

1 创建一个对象

在neko脚本中创建一个对象是非常容易的,这点和lua和js相似。

原型:

EXTERN value alloc_object( value cpy )

脚本使用的方式:

var obj = $new(null); //方式1var o = { //方式2x => 0,y => -1,msg => "hello"
}

创建一个空的对象, 其实就是分配一个结构vobject的结构指针, 使用null的方式默认最小尺寸分配内存。方式2性能要优于方式1.

c里面使用的方式:

value obj= alloc_object(NULL);

令外一种情况是复制:

var obj2  = $new(obj); // makes a copy of o

如果有参数,初始化函数将执行深复制目标对象的字段和存储内容。当然参数必须为vobject类型否则会抛出异常。 复制对象行为通过内存拷贝来进行,并不直接引用地址。

c里面使用的方式:

value obj = alloc_object(value);

2 对象的CRUD

存储一个键值对我们使用: 原型:

EXTERN void alloc_field( value obj, field f, value v );

脚本方式:

//方式1
var  o = $object(null);
o.x = 0;
o.y = 0;$objset(o,$hash("z"),0); //方式2

在c中的使用方式

alloc_field(object, val_id("x"), 0 );

设置的属性时则会在运行时散列一个访问filed,点语法性能要好于objset函数的方式,但是objset方式是有类型安全校验。如果对象不存在某个filed时运行时会创建一个filed 追加值,如果存在则更新这个field和值。

获取一个键值对我们使用 原型:

EXTERN value val_field( value o, field f );

脚本方式:


$print(o.x); //方式1$objget(o,$hash("z")); //方式2

在c中的使用方式

val_field (object, val_id("z") );

访问时如果对象没有某个field不存在则返回null。 要检查是否存在字段,可以使用$objfield内置函数检查对象是否具有给定字段,即使该字段设置为以下null值:

$objfield(o,$hash("field")); // true if o have "field"
$objfield(null,33); // false

可以使用$objremove内建删除对象的值 原型:

int otable_remove( objtable *t, field id)

$objremove(o,$hash("field")); // remove "field" from o

3 遍历属性

我们使用vobject的时候注意到voobject内部有一个objtable的结构 objtable的原型为


typedef struct _objtable
{int count;objcell *cells;
} objtable;

我们通过访问objtable可以拿到fields的数量和hashid的数组。并且获取数组的长度。

objtable *t  = &((vobject*)v)->table;
const int n = (const int)t->count ;
objcell *c = t->cells;

c就是所有id的数组。

使用脚本方式:

var a = $objfields(o); 获取属性数组

4 对象的方法

当使用点访问或内建$objcall函数调用函数时,该函数可以访问一个称为的特殊变量this,即“对象上下文”(调用该函数的对象):

o = $new(null);
o.x = 1;
o.add = function(y) { return this.x + y; }
$print(o.add(2)); // prints 3
$print( $objcall(o,$hash("add"),$array(2)) ); // prints 3
上下文在调用对象函数时设置,并且可以从任何子函数访问:foo = function() {$print(this.x);
}
o = $new(null);
o.x = 3;
o.bar = function() { foo(); };
o.bar(); // prints 3

this只需将其分配给另一个值,即可修改运行时的值; 它可以设置为任何值,而不仅仅是对象。当从对象调用中返回时,上下文被恢复,所以任何修改都会丢失:

this = 1;
o.foo = function() {// here , we have this = o;this = 2; // modify
};
o.foo();
$print(this); // 1

5 对象的原型链

原型 每个对象都可以有一个也是对象的原型。当一个字段被读取并且在一个对象中没有被发现时,它会在其原型中被递归地搜索。

原型可以使用$objgetproto和访问$objsetproto:

var proto = $new(null);
proto.foo = function() { $print(this.msg) }var o = $new(null);
o.msg = "hello";
$objsetproto(o,proto);
o.foo(); // print "hello"$objsetproto(o,null); // remove proto
o.foo(); // exception

6 对象运算符重载

几个运算符可以重载,所以当它们应用于对象时,它们实际上是调用方法。以下是可重载操作符和相应方法名称的列表:

  1. 字符串转换:%%__string%%在没有参数的情况下调用对象的方法。应该返回一个字符串
  2. 对象比较:对于两个不同对象之间的任何比较,%%__compare%%将以第二个对象作为参数在第一个对象上调用该方法
  3. 加法:a + b如果a是一个对象,a.%%__add%%(b)则被调用,否则如果b是一个对象,b.%%__radd%%(a)则被调用
  4. 减法:与加法相同但与%%__sub%%和%%__rsub%%
  5. 乘法:与加法相同,但与%%__mult%%和%%__rmult%%
  6. 除法:除了%%__div%%和之外,还有一个加法%%__rdiv%%
  7. 取模:与加法相同但与%%__mod%%和%%__rmod%%
  8. 数组读取:当一个对象作为一个读取数组被访问时,使用a[i]实际的调用a.%%__get%%(i)
  9. 数组写入:当一个对象作为一个数组进行写入时,使用a[i] = v实际的调用a.%%__set%%(i,v)

如果在操作发生时未定义重载字段,则会引发异常。

转载于:https://my.oschina.net/littlemonkeyc/blog/1786418

neko虚拟机对象文档与扩充相关推荐

  1. ODM 对象文档映射

    ODM object document mapping, 对象文档映射. 类似于关系型数据库的ORM MongoDB的ODM PyMODM MongoEngine - 基于MongoEngine的OD ...

  2. ​关于虚拟机迁移文档(p2v v2v

    全文目录 1:相关概念 2:手工迁移 2.1 P2V之再生龙 2.2 其它工具(有本中文读物) 3:自动迁移(适用于v2v) 3.1 shell迁移(试用) 3.2 ansible迁移(试用) 3.3 ...

  3. 使用脚本创建客户虚拟机模板 (文档 ID 2089028.1)

    c 转到底部 文档内容 目标   解决方案   参考 适用于: Oracle Exalogic Elastic Cloud Software - 版本 2.0.4.0.0 和更高版本 Linux x8 ...

  4. SAP ABAP 查找更改文档对象(SCDO)和表关系的在线字典1/2(全)

    SAP ABAP 查找更改文档对象(SCDO)和表关系的在线字典1/2(全) 简介: 一个 SAP 更改文档对象(SCDO:SAP Change Document Object )由一组更改表和更改设 ...

  5. 计算机网络 万维网的文档

    超文本标记语言 HTML 超文本标记语言 HTML 中的 Markup 的意思就是"设置标记". HTML 定义了许多用于排版的命令(即标签). HTML 把各种标签嵌入到万维网的 ...

  6. 第11章:MongoDB-CRUD操作--文档--查询

    ①语法 db.collection.find(query, projection) ②参数 query :可选,使用查询操作符指定查询条件 projection :可选,使用投影操作符指定返回的键.查 ...

  7. gettext()方法输出空白_如何将文档内容输出为无水印图片?超简单的操作方法看这里...

    在实际的工作生活中,我们可能会遇到这样的情况:文档内容太多,想截图以图片的形式展现,但是文档超过一屏无法全部截取,将其保存为图片的形式,但使用WPS将文档直接输出为无水印图片需要开启WPS会员. 一连 ...

  8. 《微软文档管理解决方案2007》之一:安装部署 - [SharePoint Server]

    微软在2007年底发布了几个基于MOSS 2007的解决方案(具体参看:http://bbs.msotec.net/ShowForum.aspx?ForumID=39). 最近就其中的"微软 ...

  9. 在.NET Core中使用MongoDB明细教程(1):驱动基础及文档插入

    MongoDB,被归类为NoSQL数据库(其实我更觉得MongoDb是介于关系型数据库和非关系型数据库之间,此外,在我看来在很多场景中MongoDb都可以取代关系型数据库.),是一个以类JSON格式存 ...

最新文章

  1. Paper9:Fast RCNN
  2. zabbix4.0构建实录
  3. 华为徐文伟:后香农时代,面向数学的十大挑战问题
  4. Flask实战2问答平台-父模板抽离(登录注册界面)
  5. docsify管理学习笔记
  6. 批量下载小说网站上的小说(python爬虫)
  7. Ext grid 根据行号获取行数据
  8. java url特殊字符转义字符_URL中包含有特殊字符,进行转义
  9. 【干货】腾讯人力资源与组织管理体系.pptx(附下载链接)
  10. HTML5第6章上机,第6章__HTML5的表单.ppt
  11. wword中如何在方框(□)中打钩(√)
  12. SpringBoot2.x 集成 腾讯云短信
  13. 太极计算机logo,太极图:最古最美最富有涵义的标志
  14. 橡胶材料特性和本构关系【转】_51CAE_新浪博客
  15. 干货 | Elasticsearch Nested类型深入详解
  16. 微信小程序之获取接口数据展示
  17. Ubuntu搭建EDK2环境
  18. 【Vue】后台管理系统
  19. 快速打开电脑计算机的快捷键,电脑自带的计算器如何快速打开和快捷键的添加...
  20. Red Hat Enterprise Linux 7.2

热门文章

  1. Android版疯狂填字第三关,iOS/安卓版《疯狂填字》答案攻略第三十八关
  2. 虎年开工第一天,你实现下班自由了吗?
  3. 室内场馆360全景拍摄的注意事项
  4. 高管激励的有效手段----股权激励
  5. 就在明天 用友企业数智化财务峰会落地广州,聚焦实现业财合一新价值
  6. Android 系统下载 DownloadManager
  7. 【C++代码】约瑟夫环问题:0,1,……,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。
  8. 教培机构如何深耕种子用户从0到1-线上线下教学的有效融合
  9. Excel效率手册:早做完,不加班(套装共3册)
  10. Python基础,day2