Неинициализированная переменная-член haxe несовместима на разных платформах

Я пытаюсь перекрестно скомпилировать существующее флеш-приложение, написанное на haxe, в javascript, используя openfl и haxe.

Под вспышкой я могу делать следующее:

class foo
{
    var bar : Int;

    public function new()
    {
        trace(bar); //under flash prints 0, under javascript undefined
    }
}

При компиляции в javascript вместо 0 я получаю Undefined.

Мои вопросы: могу ли я сделать предупреждения / ошибки печати компиляции, если переменная-член остается неинициализированной конструктором.

Еще лучше я могу сделать haxe, я сделаю так, чтобы haxe инициализировал их для меня в js до 0.

Та же история с Bool = false, Float = 0 и т.д., я не тестировал, но, вероятно, и с Object = null.

В приложении 144 класса и более 20 тысяч строк кода. Поиск и добавление явных инициализаторов вручную займет уйму времени, поэтому я ищу альтернативы.


person tesract    schedule 13.06.2014    source источник
comment
Это задокументированное поведение: haxe.org/manual/types-nullability.html - в основном на динамических платформах (JS, Neko, PHP, Python) значение по умолчанию всегда будет нулевым. Ответ @Nico был правильным - просто инициализируйте его до нуля, когда вы его объявляете, и вы будете в безопасности.   -  person Jason O'Neil    schedule 14.06.2014


Ответы (3)


Почему бы вам просто не сделать: var bar:Int = 0; Если у вас нет конкретной ситуации, когда это действительно важно (с чем я столкнулся), это не должно иметь большого значения :)

person Nico    schedule 14.06.2014
comment
Существующий исходный код haxe состоит из 144 классов и более 26 тысяч строк кода. Я бы очень хотел, чтобы вручную не находил каждое место, где требуется = 0 или = false. - person tesract; 16.06.2014

Как было отмечено ранее, это задокументировано: haxe.org/manual/types-nullability.html. Причина проста: скорость.

Но следует отметить несколько моментов.

В javascript это можно исправить без потери скорости и с небольшим увеличением размера файла. Это даже заставляет код работать быстрее. Вы можете сделать это, установив значения по умолчанию для прототипов объектов, что, в свою очередь, можно сделать довольно просто, используя функцию настраиваемого генератора js.

Я полагаю, что для других платформ такого способа нет, поэтому единственное, к чему можно прибегнуть, - это динамическая инициализация. Но не бойтесь! Макросы здесь для вас. Довольно легко написать макрос, который будет уведомлять вас о неинициализированных значениях, а также довольно легко написать макрос, который будет инициализировать их за вас.

Но, честно говоря, я не вижу в этом особой проблемы, может, вы ее переоцениваете? Я работаю с haxe годами, каждый день, и у меня никогда не возникало серьезных проблем с этим. В большинстве случаев это вас совсем не беспокоит, поскольку вы обычно инициализируете объекты динамически, а в тех случаях, когда вы этого не делаете, на устранение таких проблем обычно требуется около 5 секунд. Просто ИМХО конечно.

person stroncium    schedule 20.06.2014
comment
Поскольку я запустил команду sed для инициализации всего, многие проблемы исправлены. Приложение flash было написано так, чтобы полагаться на автоматическую инициализацию переменных, поэтому в javascript это вызывало множество тонких ошибок. Все это ушло, и теперь я могу сосредоточиться на исправлении таких вещей, как openfl, не реализующий flash.display.drawRoundRect. - person tesract; 23.06.2014

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

Из корня исходного дерева я выполнил следующие команды под ubuntu.

find . -print0 -name "*.hx" | xargs -0 -n1 sed -i -e "s/\(var [^:]\+:\s*Int\s*\);/\1 = 0;/g"
find . -print0 -name "*.hx" | xargs -0 -n1 sed -i -e "s/\(var [^:]\+:\s*UInt\s*\);/\1 = 0;/g"
find . -print0 -name "*.hx" | xargs -0 -n1 sed -i -e "s/\(var [^:]\+:\s*Bool\s*\);/\1 = false;/g"
find . -print0 -name "*.hx" | xargs -0 -n1 sed -i -e "s/\(var [^:]\+:\s*Float\s*\);/\1 = 0;/g"
find . -print0 -name "*.hx" | xargs -0 -n1 sed -i -e "s/\(var [^:]\+:\s*[^=]\+\s*\);/\1 = null;/g"

Это заменит

var [variableName] : Int;  

с участием

var [variableName] : Int = 0;

Аналогично UInt, Bool, Float. Для всех остальных типов установлено значение null.

Я не писал ни одного для var [varName];, поскольку в моем исходном дереве было всего 4 экземпляра.

person tesract    schedule 16.06.2014