Haxe中的常量

10

在 Haxe 中如何创建公共常量?我只需要类似 AS3 中的 const

public class Hello
{
     public static const HEY:String = "hey";
}
2个回答

25
通常在Haxe中声明常量的方式是使用 staticinline 修饰符。
class Main {
    public static inline var Constant = 1;

    static function main() {
        trace(Constant);
        trace(Test.Constant);
    }
}

如果您有一组相关的常量,通常可以使用 enum abstract。枚举抽象的值是隐式的 staticinline
请注意,只有基本类型(IntFloatBool)以及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>只是一个抽象类型,通过执行以下操作创建一个只读的“视图”:
  • 它包装了Array<T>
  • 它使用@:forward仅公开不会改变数组的字段,例如lengthmap()
  • 它允许隐式转换from Array<T>

您可以在此处查看其实现方式。


9
对于非静态变量和对象,您可以像下面所示一样赋予它们浅层constness:
public var MAX_COUNT(default, never):Int = 100;

这意味着您可以以“默认”的方式读取该值,但永远不能对其进行写入操作。更多信息请参见http://adireddy.github.io/haxe/keywords/never-inline-keywords

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接