“结构具有额外的字段”错误的背后原因是什么?

时间:2018-10-18 12:26:29

标签: haxe

考虑以下代码:

var t: {a: Int} = {a:100, b:200};

它不会编译并显示错误:{ b : Int, a : Int } has extra field b

但是此代码可以很好地编译:

class Foo {
    public var a: Int = 100;
    public var b: Int = 200;
    public function new() {}
}
...
var t: {a: Int} = new Foo();

为什么禁止第一种情况?

如果有一些额外的字段怎么办?如果出现问题,为什么要在第二种情况下允许使用它们。

2 个答案:

答案 0 :(得分:5)

之前已经对此进行了讨论in this issue,其中Nicolas针对当前行为给出了以下理由:

  

这个想法是不允许减少常数结构。例如,这允许检查以下内容:

function foo(o:{?x:Int,?y:Int}) {
}
var pt = { x: 0, yy : 1 }; // typo
foo(pt); // goes unnoticed
     

此外,如果您修改foo的签名(例如,通过删除字段),则会产生错误。

但是,问题仍然存在,并且看起来行为可能会更改以允许将来出现这种情况。

答案 1 :(得分:3)

我想在这里回答:https://groups.google.com/forum/#!topic/haxelang/KQO4eFUb-N0

尼古拉斯解释:

  

在您的示例中,两个都被视为常量,然后出现错误   打印出来,因为它有额外的字段。该错误是按顺序添加的   从必填项中删除字段时启用代码清除   结构:它将告诉您该字段仍然通过的每个位置   (在传递常量时,通常会发生这种情况)。

     

我同意进行简单的测试(例如,   您自己的代码,但在实际代码中很少发生。