Haxe 语言特性¶
参考:https://haxe.org/manual/lf.html & https://haxe.org/documentation/introduction/language-features.html
- 抽象类型
抽象类型是编译时构造,在运行时以不同的方式表示。这允许赋予现有类型全新的含义。
- 匿名结构
可以很容易地将数据分组到匿名结构中,从而最小化小数据类的必要性。
var point = { x: 0, y: 10 }; point.x += 10;
- 数组推导
使用 for 循环和逻辑快速创建和填充数组。
var evenNumbers = [ for (i in 0...100) if (i%2==0) i ];
- 类、接口和继承
Haxe 允许在类中构造代码,使其成为一种面向对象的语言。支持 Java 等语言中常见的相关特性,包括继承和接口。
- 条件编译
条件编译允许根据编译参数编译特定的代码。这有助于抽象特定于目标的差异,但也可以用于其他目的,比如更详细的调试。
#if js js.Lib.alert("Hello"); #elseif sys Sys.println("Hello"); #end
- (广义)代数数据类型
结构可以通过代数数据类型(algebraic data types,简称 ADT)表示,在 Haxe 语言中称为枚举。此外,Haxe 支持它们的广义变体 GADT。
enum Result { Success(data:Array<Int>); UserError(msg:String); SystemError(msg:String, position:PosInfos); }
- 内联调用
函数可以被设计成内联的,允许它们的代码被插入到调用站点。这可以产生显著的性能优势,而无需通过手工内联进行代码复制。
- 迭代器
在 Haxe 中迭代一组值(例如数组元素)非常容易。自定义类可以快速实现迭代器功能以允许迭代。
for (i in [1, 2, 3]) { trace(i); }
- 局部函数和闭包
Haxe 中的函数不局限于类字段,也可以在表达式中声明,从而允许强大的闭包。
var buffer = ""; function append(s:String) { buffer += s; } append("foo"); append("bar"); trace(buffer); // foobar
- 元数据
向字段、类或表达式中添加元数据。这可以将信息传递给编译器、宏或运行时类。
class MyClass { @range(1, 8) var value:Int; } trace(haxe.rtti.Meta.getFields(MyClass).value.range); // [1,8]
- 静态扩展
通过使用静态扩展,现有的类和其他类型可以用额外的功能进行扩展。
using StringTools; " Me & You ".trim().htmlEscape();
- 字符串插值
用单引号声明的字符串能够访问当前上下文中的变量。
trace('My name is $name and I work in ${job.industry}');
- 部分函数应用程序
任何函数都可以部分应用,提供一些参数的值,其余的留到以后填充。
var map = new haxe.ds.IntMap(); var setToTwelve = map.set.bind(_, 12); setToTwelve(1); setToTwelve(2);
- 模式匹配
可以根据模式匹配复杂结构,从枚举或结构中提取信息,并为特定的值组合定义特定的操作。
var a = { foo: 12 }; switch (a) { case { foo: i }: trace(i); default: }
- 属性
可以将变量类字段设计为具有自定义读写访问权限的属性,从而允许细粒度的访问控制。
public var color(get,set); function get_color() { return element.style.backgroundColor; } function set_color(c:String) { trace('Setting background of element to $c'); return element.style.backgroundColor = c; }
- 类型参数、约束和方差
可以使用类型参数对类型进行参数化,从而允许类型容器和其他复杂的数据结构。类型参数也可以被限制为特定的类型并遵循方差规则。
class Main<A> { static function main() { new Main<String>("foo"); new Main(12); // use type inference } function new(a:A) { } }