问号运算符的含义'?'在Haxe的争论之前

时间:2015-08-10 08:10:33

标签: haxe

这两个功能签名有什么区别?

function f(?i:Int = 0) {}
function f(i:Int = 0) {}

参数是否以?为前缀似乎没有任何区别,两者都编译正常。

2 个答案:

答案 0 :(得分:14)

在这个例子中确实没有理由使用?,但是有区别。

statically typed target上,f(null)无法编译,因为基本类型IntFloatBool不在nullable。但是,? implies nullability,意味着

function f(?i:Int)

实际上与

相同
function f(i:Null<Int> = null)

如您所见,?有两个影响:

  • 添加了null default value,因此您可以在通话期间忽略if();
  • 该类型包含在Null<T>中。虽然这对动态目标没有影响,但它通常在静态目标上具有运行时性能成本(同样:{em>仅用于Int / Float / Bool参数)

我能想到为什么你希望基本类型的参数可以为空的唯一原因是启用可选参数跳过。在此示例中调用f时,i只有在可以为空的情况下才能跳过:

class Main {
    static function main() {
        f("Test"); // 0, "Test"
    }

    static function f(?i:Int = 0, s:String) {
        trace(i, s);
    }
}

请注意,如果您向可选参数添加default value,即使您明确传递null,也会使用该值:

class Main {
    static function main() {
        f(); // 0
        f(null); // 0
    }

    static function f(?i:Int = 0) {
        trace(i);
    }
}

答案 1 :(得分:0)

他们是两回事。一个 ?表示可选参数。因此,如果可以完全从函数调用中排除,则不会发生替换。

(x:Float = 12)是默认参数。意味着如果将其从函数调用中排除,则将使用值12。