如何解决编译时未检查可选参数 Haxe
我今晚刚刚发现了 Haxe,我很高兴地惊讶于它的语法对开发人员的友好程度。很容易理解,很高兴它接近 ECMAScript。
.
└── src/
├── http/
│ ├── Router.hx
│ └── Route.hx
└── Main.hx
我有一个 Router 类,它声明了一个“addGetRoute”方法,带有一个可选的第二个参数:
package http;
import http.Route;
class Router
{
var routes: Array<Route>;
public function new()
{
this.routes = [];
}
public function addGetRoute(route: String,?handler: () -> String): Void
{
this.routes.push(new Route(route,handler));
}
}
这是Route类的内容:
package http;
class Route
{
var route: String;
var handler: () -> String;
public function new(route: String,handler: () -> String)
{
this.route = route;
this.handler = handler;
}
}
我不明白的是,编译器在看到这段代码时不会抛出错误:
this.routes.push(new Route(route,handler));
我希望它会抛出错误,因为第二个参数可以为空。
我错过了什么吗?
解决方法
默认情况下,Haxe 中除了基本类型(Int
、Float
、Bool
)之外的所有内容都是 nullable,包括对函数的引用(甚至基本类型在动态目标上也是可以为空的)。虽然向参数添加 ?
确实将类型包装在 Null<T>
中,但如果类型已经可以为空,则不会产生任何影响。使用 ?
生成参数 "optional" 的主要原因是它隐含 = null
default value,允许在调用站点跳过它。
从 Haxe 4 开始,实际上有一个选择加入的 null safety 功能,它强制只有 Null<T>
可以为空,因此会给你所需的编译器错误:
@:nullSafety // opt-into null safety
class Main {
static function main() {
new Route("example",null);
}
}
source/Main.hx:4:字符 24-28:空安全:无法将可为空的值传递给函数“new”的不可为空的参数“处理程序”。
但是,请注意,空安全仍然被认为是实验性的,您可能会在这里和那里遇到一些粗糙的边缘。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。