如何在Haxe中创建公共常量?我只需要在AS3中模拟旧的const
:
public class Hello
{
public static const HEY:String = "hey";
}
答案 0 :(得分:18)
在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。
答案 1 :(得分:6)
对于非静态变量和对象,可以给它们浅层常量,如下所示:
public var MAX_COUNT(default, never):Int = 100;
这意味着您可以阅读&#39;默认值&#39;方式,但不能&#39;永远&#39;写信给它。
可以找到更多信息http://adireddy.github.io/haxe/keywords/never-inline-keywords。