Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Интересный баг as3, instantiation on non-constructor (http://www.flasher.ru/forum/showthread.php?t=212426)

caseyryan 08.02.2016 11:54

Интересный баг as3, instantiation on non-constructor
 
Обнаружил сегодня интересную штуку. Если сделать в классе вот так
Код AS3:

private static var _achievements:Array = [
        new Achievement(100, 1, AchievementCondition.KILL_ZOMBIES),
        new Achievement(101, 100, AchievementCondition.KILL_ZOMBIES),
        new Achievement(102, 500, AchievementCondition.KILL_ZOMBIES),
        new Achievement(103, 1000, AchievementCondition.KILL_ZOMBIES),
        new Achievement(104, 5000, AchievementCondition.KILL_ZOMBIES),
        new Achievement(105, 10000, AchievementCondition.KILL_ZOMBIES),
        new Achievement(106, 50000, AchievementCondition.KILL_ZOMBIES),
        new Achievement(107, 100000, AchievementCondition.KILL_ZOMBIES),
        new Achievement(201, 10, AchievementCondition.KILL_BOSSES),
        new Achievement(202, 50, AchievementCondition.KILL_BOSSES),
        new Achievement(301, 10, AchievementCondition.SPEND_TIME_IN_GAME),
        new Achievement(302, 60, AchievementCondition.SPEND_TIME_IN_GAME),
        new Achievement(303, 120, AchievementCondition.SPEND_TIME_IN_GAME),
        new Achievement(304, 120, AchievementCondition.SPEND_TIME_IN_GAME),
        new Achievement(305, 300, AchievementCondition.SPEND_TIME_IN_GAME),
        new Achievement(306, 30, AchievementCondition.SPEND_TIME_IN_GAME),
        new Achievement(401, 10, AchievementCondition.COLLECT_WEAPONS),
        new Achievement(501, 10, AchievementCondition.COLLECT_KEYS),
        new Achievement(502, 50, AchievementCondition.COLLECT_KEYS),
        new Achievement(503, 100, AchievementCondition.COLLECT_KEYS),
        new Achievement(601, 5, AchievementCondition.COLLECT_ARTEFACTS),
        new Achievement(602, 50, AchievementCondition.COLLECT_ARTEFACTS),
        new Achievement(603, 100, AchievementCondition.COLLECT_ARTEFACTS),
        new Achievement(604, 500, AchievementCondition.COLLECT_ARTEFACTS),
        new Achievement(701, 2, AchievementCondition.PASS_CHAPTER),
        new Achievement(702, 10, AchievementCondition.PASS_CHAPTER),
        new Achievement(703, 20, AchievementCondition.PASS_CHAPTER)
];

А сам класс Achievement объявить в том же файле как internal, то в рантайме вывалится ошибка
Код AS3:

instantiation on non-constructor

Стало быть статики инициализируются раньше, чем internal классы. Если же Achievement вынести как отдельный класс, все работает отлично. Так же будет если переменную сделать не статической.

п.с. это не вопрос почему так происходит, а просто решил поделиться инфой)

Tails 08.02.2016 12:03

Тоже как-то раз напоролся на подобное поведение, связанное с не явным порядком вызова статического конструктора в as3. Вообще, стараюсь не использовать статику там, где можно обойтись обычным классом.

Кстати, а почему статика и почему internal?

caseyryan 08.02.2016 12:20

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

Tails 08.02.2016 12:21

Ясно )

alatar 08.02.2016 13:07

Похоже он просто определение класса не находит. Если перенести Achievement в начало файла, то всё заработает.

caseyryan 08.02.2016 13:12

Цитата:

Сообщение от alatar (Сообщение 1191673)
Похоже он просто определение класса не находит. Если перенести Achievement в начало файла, то всё заработает.

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

alatar 08.02.2016 13:28

Надо байткод смотреть... но лень.


Часовой пояс GMT +4, время: 06:18.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.