4

正如我在问题中提到的,

如何在 Haxe 中使用合并运算符?

4

3 回答 3

6

Haxe 没有像 C# 那样的空合并运算符??

话虽如此,使用宏可以实现类似的效果。看起来有人已经在几年前编写了一个完全这样做的库。这是其自述文件中的一个示例:

var s = Sys.args()[0];
var path = s || '/default/path/to/../';

它使用现有的||运算符,因为宏不能引入全新的语法。


但是,我个人可能更喜欢这样的静态扩展

class StaticExtensions {
    public static function or<T>(value:T, defaultValue:T):T {
        return value == null ? defaultValue : value;
    }
}
using StaticExtensions;

class Main {
    static public function main() {
        var foo:String = null;
        trace(foo.or("bar")); // bar
    }
}

除了自己制作,您还可以考虑使用safety,它有许多额外的静态扩展Null<T>和一般处理的功能null

于 2019-09-02T17:55:39.440 回答
3

使用这个插件:

https://github.com/skial/nco

然后,输入

var value = a || 'backup value';

代替

var value = (a == null) ? 'backup value' : a;

于 2019-09-02T17:47:45.767 回答
1

为此,您还可以使用摘要而不是宏

class Test {
  static function main() {
    trace("Haxe is great!");
    var s:Ory<String> = "hi!";
    trace(s || "I don't get picked");
    s = null;
    trace(s || "I get picked");
    trace(s + "!");
  }
}
@:forward abstract Ory<T>(T) from T to T {
  @:op(a||b) public inline function or(b:T):Ory<T> {
    return this != null ? this : b;
  }
}
于 2019-09-03T11:16:58.367 回答