В чем причина ошибки "структура имеет дополнительное поле" - PullRequest
0 голосов
/ 18 октября 2018

Рассмотрим этот код:

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 голосов
/ 18 октября 2018

Ранее это обсуждалось в этом выпуске , где Николас приводит следующие аргументы в пользу текущего поведения:

Идея состоит в том, что постоянные структуры не могут быть уменьшены,Это позволяет, например, проверить следующее:

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

Кроме того, оно выдаст ошибку, если вы измените сигнатуру foo, например, удалив поле.

Однакопроблема остается открытой, и похоже, что поведение может быть изменено, чтобы разрешить это в будущем.

0 голосов
/ 18 октября 2018

Я думаю, что здесь ответили: https://groups.google.com/forum/#!topic/haxelang/KQO4eFUb-N0

Николас объяснил:

В вашем примере оба считаются постоянными значениями, и затем выводится ошибка, потому что она имеет дополнительныеполя.Эта ошибка была добавлена ​​для того, чтобы включить очистку кода при удалении поля из требуемой структуры: она будет сообщать вам каждое место, где это поле все еще пропускается (при передаче константы, которая происходит большую часть времени).

Я согласен, что эта ошибка немного вводит в заблуждение при выполнении простых тестов, таких как ваш, но в реальном коде это происходит редко.

...