博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
类型抽象Haxe3新增特性:抽象类型 -- Abstract Types
阅读量:5821 次
发布时间:2019-06-18

本文共 2349 字,大约阅读时间需要 7 分钟。

PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘。目前又不当COO,还是得用心记代码哦!

    官网文档链接在此:http://haxe.org/manual/abstracts

    还没有在项目中具体应用Haxe3,先参考英文文档说一下自己的懂得:

    抽象类型主要有两种应用方式:

    1. 定义基本数值类型的隐式转换,如Int, Float, Void等,这类方式主要是Haxe核心数据部分在应用,一般开发中可能很少直接碰到;

    2. 定义一个不透明的外包装类型(显式定义,显式应用的新类型),用以包装另外一种类型,并在外包装类型上定义针对被包装类型的隐式转换,和操作符重载。

    第二种应用方式非常壮大,比如在上面官网文档的例子中,定义了一个StringSplitter抽象类型,用以把字符串经过隐式转换拆成字符数组(实际上是单字符组成的字符串数组),而且,因为Haxe3中答应内联构造函数,以及抽象类型答应对this直接赋值,因此最终生成的代码极其简练,完整没有对象创立、函数调用等致使的效率损失。

    抽象类型的定义:

abstract StringSplitter(Array
) { inline function new(a:Array
) this = a @:from static public inline function fromString(s:String) { return new StringSplitter(s.split("")); }}

    抽象类型的应用:

class Main {    static function main() {        var splitter:StringSplitter = "Hello";        trace(splitter); // [H,e,l,l,o]    }}

    实际生成的Haxe代码:

// dump/Main.dumpclass Main{    static main(method) : Void -> Void     = function() = {        var splitter = cast "Hello".split("");        haxe.Log.trace(splitter,{fileName : "Main.hx",lineNumber : 13,className : "Main",methodName : "main"});    };}
    每日一道理
只有启程,才会到达理想和目的地,只有拼搏,才会获得辉煌的成功,只有播种,才会有收获。只有追求,才会品味堂堂正正的人。

    另外值得大书特书的就是操作符重载机制了,原来就有一些大牛应用Haxe2的宏macro机制实现了运算符重载,现在Haxe3带来了官方的,更优雅,更壮大的运算符重载机制:

abstract MyInt(Int) from Int to Int {    // MyInt + MyInt can be used as is, and returns a MyInt    @:op(A + B) static public function add(lhs:MyInt, rhs:MyInt):MyInt;    @:commutative @:op(A * B) static public function repeat(lhs:MyInt, rhs:String):String {        var s:StringBuf = new StringBuf();        for (i in 0...lhs)            s.add(rhs);        return s.toString();    }}

    也可以重载数组访问符即中括号:

abstract MyReflect({}) from {} {    @:arrayAccess public inline function arrayAccess(key:String):Dynamic {        return Reflect.field(this, key);    }        @:arrayAccess public inline function arrayWrite
(key:String, value:T):T { Reflect.setField(this, key, value); return value; }}

    特殊值得指出的是,抽象类型应该是用类似宏的机制实现的,也就是说,抽象类型是纯编译期概念,是用来定义其被包装类型的操作的,它其实不实际存在于运行期。因此你在运行期用反射是没法找到或应用抽象类型的。

    

    

    

文章结束给大家分享下程序员的一些笑话语录: 女人篇

  有的女人就是Windows虽然很优秀,但是安全隐患太大。
  有的女人就是MFC她条件很好,然而不是谁都能玩的起。
  有的女人就是C#长的很漂亮,但是家务活不行。
  有的女人就是C++,她会默默的为你做很多的事情。
  有的女人就是汇编虽然很麻烦,但是有的时候还得求它。
  有的女人就是SQL,她会为你的发展带来莫大的帮助。

--------------------------------- 原创文章 By

类型和抽象
---------------------------------

转载地址:http://plfdx.baihongyu.com/

你可能感兴趣的文章
Java web 新手项目
查看>>
Java动态编程初探
查看>>
Javascript权威指南笔记-数组
查看>>
Qtum量子链周报(4月15日-4月21日)
查看>>
JS基础知识深入总结
查看>>
Object.defineProperty使用小记
查看>>
猫哥教你写爬虫 028--模块介绍-小作业-广告牌
查看>>
Android直播环境搭建
查看>>
天呐!你竟然不知道Flutter中的"通知冒泡"
查看>>
记一次解决Nacos-SpringBoot不支持@ConditionalOnProperty
查看>>
用户场景描述
查看>>
2019应届生去公司找个Java程序员的职位需要什么技能?
查看>>
记录下小程序的webview分享内页
查看>>
js最常用的数组方法(总结)
查看>>
思维导图整理的Vue好资源
查看>>
前端学习
查看>>
Github挂载Travis CI自动打包上传pages分支
查看>>
【入门】分布式Session一致性入门简介
查看>>
es2016的两个语法,includes和 **,es2017的语法Object.values(obj),Object.values(obj)
查看>>
调用系统相册
查看>>