Haxe的常数

问题描述 投票:7回答:2

你如何在Haxe中创建公共常量?我只需要在AS3中使用好的旧const

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

在Haxe中声明常量的常用方法是使用staticinline修饰符。

class Main {
    public static inline var Constant = 1;

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

如果你有一组相关的常量,使用enum abstract通常是有意义的。 enum摘要的值隐含地是staticinline


请注意,只允许基本类型(IntFloatBool)以及Stringinline,对于其他类型,它将失败并出现此错误:

内联变量初始化必须是常量值

幸运的是,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只显示不改变数组的字段,例如lengthmap()
  • 它允许implicit casts from Array<T>

你可以看看它是如何实现的here


7
投票

对于非静态变量和对象,可以为它们提供浅常量,如下所示:

public var MAX_COUNT(default, never):Int = 100;

这意味着您可以以“默认”方式读取值,但可以“永不”写入它。

更多信息可以在http://adireddy.github.io/haxe/keywords/never-inline-keywords找到。

© www.soinside.com 2019 - 2024. All rights reserved.