【问题标题】:Optional argument not checked at compile time Haxe编译时未检查可选参数 Haxe
【发布时间】:2020-12-21 22:07:17
【问题描述】:

我今晚刚刚发现了 Haxe,我很高兴地惊讶于它的语法对开发人员的友好程度。很快就明白了,真的很高兴它接近 ECMAScript。

.
└── src/
    ├── http/
    │   ├── Router.hx
    │   └── Route.hx
    └── Main.hx

我有一个路由器类,它声明了一个“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


    【解决方案1】:

    默认情况下,除基本类型(Int、Float、Bool)之外的所有内容在 Haxe 中都是 nullable,包括对函数的引用(甚至基本类型在动态时也可以为空目标)。虽然将? 添加到参数确实会将类型包装在Null&lt;T&gt; 中,但如果类型已经可以为空,则不会产生任何影响。将"optional" 与? 争论的主要原因是它隐含了= null default value,它允许在调用站点跳过它。

    从 Haxe 4 开始,实际上有一个可选的 null safety 功能,它强制只有 Null&lt;T&gt; 可以为空,因此会给您所需的编译器错误:

    @:nullSafety // opt-into null safety
    class Main {
        static function main() {
            new Route("example", null);
        }
    }
    

    source/Main.hx:4:字符 24-28:Null 安全性:无法将可为 null 的值传递给函数“new”的不可为 null 的参数“handler”。

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

    【讨论】:

      猜你喜欢
      • 2015-06-24
      • 2013-09-29
      • 2020-10-04
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多