这两个函数签名有什么区别?
function f(?i:Int = 0) {}
function f(i:Int = 0) {}
参数是否带有前缀似乎没有任何区别?
,两者都编译良好。
确实没有理由使用?
在这个例子中,但是有一个区别。
On a 静态类型目标 https://haxe.org/documentation/introduction/compiler-targets.html, f(null)
由于基本类型而无法编译Int
, Float
and Bool
不是nullable https://haxe.org/manual/types-nullability.html那里。但是,那?
意味着可为空 http://haxe.org/manual/types-function-optional-arguments.html, 意思是
function f(?i:Int)
实际上是一样的
function f(i:Null<Int> = null)
如您所见,?
有两个作用:
- A
null
默认值 https://haxe.org/manual/types-function-default-values.html已添加,因此可以省略i
通话期间:f();
- 该类型被包裹在Null<T> https://api.haxe.org/Null.html?。虽然这对动态目标没有影响,但它通常会在静态目标上产生运行时性能成本(同样:only for
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);
}
}
请注意,如果您添加默认值 http://haxe.org/manual/types-function-default-values.html对于可选参数,即使您明确传递该值,也会使用该值null
:
class Main {
static function main() {
f(); // 0
f(null); // 0
}
static function f(?i:Int = 0) {
trace(i);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)