Является ли Haxe строго типизированным или слабо типизированным (или и то, и другое?)

Я начинаю изучать Haxe и хочу знать, является ли Haxe строго или слабо типизированным. Если его система типов не является строгой или слабой, то является ли он «факультативно типизированным», как Язык программирования Dart?

Я заметил, что эта строка кода работает, несмотря на отсутствие явного объявления типа: var a = [["This is a nested array"], ["This is another nested array"], "This is not a nested array" ];


person Anderson Green    schedule 21.11.2012    source источник


Ответы (2)


Haxe по большей части является строго типизированным языком, однако он не так строг, как можно было бы ожидать. Он намного мягче, чем некоторые другие языки, и позволяет при необходимости выйти за рамки системы типов. И это не требует, чтобы вы каждый раз указывали все ваши типы - компилятор использует вывод типа, чтобы "вывести" тип - в вашем примере выведенный тип Array<Dynamic>

С Хаксом:

  • Компилятор по умолчанию использует строгую типизацию. Вы можете предоставить информацию о типе (например, var x:Array<Int>;) или позволить компилятору сделать вывод (например, var x = [0,1,2], x будет Array:Int).

  • Вы можете проверить предполагаемый тип, используя $type(myVariable); Это может быть полезно для выяснения того, что происходит.

  • Если вывод типа сбивает вас с толку или компилятор сбивается с толку, иногда бывает проще определить ваши типы явно, чтобы не было путаницы.

  • Вы можете избежать системы типов (если она мешает или если вы пытаетесь работать с нативной библиотекой и т. д.), используя либо Динамический, Отражение или нетипизированный.

  • Проверка типов Haxe — это в основном функция времени компиляции. Типы проверяются и гарантируют правильность при компиляции кода. Однако, если вы попытаетесь делать странные вещи во время выполнения, проверка типов не произойдет, и вы рискуете сломать что-то.

  • Некоторые цели Haxe слабо типизированы (например, Javascript, Neko). Однако, поскольку проверка типов Haxe происходит во время компиляции, вы получаете все преимущества строго типизированных языков — проверку ошибок, автодополнение и т. д. Скомпилированный Javascript или Neko Bytecode не будут знать о типах, но это не имеет значения — Haxe убедился, что все работает.

Чтобы помочь вам разобраться, вот несколько ссылок:

person Jason O'Neil    schedule 22.11.2012

Он строго типизирован, и вывод типа компилятора Haxe проделывает невероятную работу по поиску правильного типа ваших данных.

Следуя примеру здесь: http://haxe.org/ref/type_infer — попробуйте этот хитрый прием:

var a = [["This is a nested array"], ["This is another nested array"], "This is not a nested array" ];
var b = $type(a);

Это даст вам предупреждение с сообщением

Warning : Array<Dynamic>

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

Как следствие, ваше определение переменной

var a = [["This is..."], ["This is another..."], "This is not..." ];

является полностью синонимом следующего, включая явное определение типа:

var a:Array<Dynamic> = [["This is..."], ["This is another..."], "This is not..." ];
person Cambiata    schedule 22.11.2012
comment
Это то же самое, что и утиная печать, или есть какая-то тонкая разница? - person Anderson Green; 22.11.2012
comment
Duck Typing говорит, что если это выглядит как утка, плавает как утка и крякает как утка, то это утка. Система классов Haxe этого не делает — если класс требуется, он должен быть экземпляром этого класса, а не просто похожим на него объектом. Если вы действительно хотите использовать Duck Typing (поэтому любой похожий объект считается действительным), вы можете использовать Typedef, а затем используйте либо классы, либо анонимные объекты для сопоставления. - person Jason O'Neil; 22.11.2012
comment
То, что делает компилятор в примере Йонаса, — это не утиная типизация, а фактическое определение типа. Как только компилятор определился с типом (в данном случае Array‹Dynamic›), он действует как строго типизированная переменная. - person Jason O'Neil; 22.11.2012