【问题标题】:Constants in HaxeHaxe 中的常量
【发布时间】:2014-08-21 10:40:06
【问题描述】:

如何在 Haxe 中创建公共常量?我只需要 AS3 中好老 const 的模拟:

public class Hello
{
     public static const HEY:String = "hey";
}

【问题讨论】:

    标签: haxe


    【解决方案1】:

    在 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&lt;T&gt; 只是一个 abstract type,它通过执行以下操作创建只读“视图”:

    • 它包裹Array&lt;T&gt;
    • 它使用@:forward 只公开不改变数组的字段,例如lengthmap()
    • 它允许implicit casts from Array&lt;T&gt;

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

    【讨论】:

      【解决方案2】:

      对于非静态变量和对象,你可以给他们浅常量,如下所示:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多