【发布时间】:2014-08-21 10:40:06
【问题描述】:
如何在 Haxe 中创建公共常量?我只需要 AS3 中好老 const 的模拟:
public class Hello
{
public static const HEY:String = "hey";
}
【问题讨论】:
标签: haxe
如何在 Haxe 中创建公共常量?我只需要 AS3 中好老 const 的模拟:
public class Hello
{
public static const HEY:String = "hey";
}
【问题讨论】:
标签: haxe
在 Haxe 中声明常量的常用方法是使用 static 和 inline 修饰符。
class Main {
public static inline var Constant = 1;
static function main() {
trace(Constant);
trace(Test.Constant);
}
}
如果您有一组相关的常量,使用enum abstract 通常是有意义的。枚举摘要的值隐含为static 和inline。
请注意,只有基本类型(Int、Float、Bool)以及String 允许为inline,对于其他类型,它将失败并出现此错误:
内联变量初始化必须是常量值
幸运的是,Haxe 4 引入了一个 final 关键字,这对这种情况很有用:
public static final Regex = ~/regex/;
然而,final 仅防止重新分配,它不会使类型不可变。因此,仍然可以从 static final Values = [1, 2, 3]; 之类的内容中添加或删除值。
对于数组的特定情况,Haxe 4 引入了haxe.ds.ReadOnlyArray,它允许“常量”列表(假设您不使用强制转换或反射来解决它):
public static final Values:haxe.ds.ReadOnlyArray<Int> = [1, 2, 3];
Values = []; // Cannot access field or identifier Values for writing
Values.push(0); // haxe.ds.ReadOnlyArray<Int> has no field push
尽管这是一个特定于数组的解决方案,但同样的方法也可以应用于其他类型。 ReadOnlyArray<T> 只是一个 abstract type,它通过执行以下操作创建只读“视图”:
Array<T>
@:forward 只公开不改变数组的字段,例如length 和map()
from Array<T>
你可以看到它是如何实现的here。
【讨论】:
对于非静态变量和对象,你可以给他们浅常量,如下所示:
public var MAX_COUNT(default, never):Int = 100;
这意味着您可以以“默认”方式读取值,但不能“从不”写入。
更多信息可以在http://adireddy.github.io/haxe/keywords/never-inline-keywords找到。
【讨论】: