编译时未检查可选参数 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 中除了基本类型(IntFloatBool)之外的所有内容都是 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”的不可为空的参数“处理程序”。

但是,请注意,空安全仍然被认为是实验性的,您可能会在这里和那里遇到一些粗糙的边缘。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...