понедельник, февраля 11, 2008

if vs. switch. SmartFoxServer

Странное поведение серверного интерпретатора в обработчике handleInternalEvent(evt) .
Прямая проверка срабатывает:
if (evt.name=="spectatorSwitched") {}
Однако вариантная проверка работать отказывается!
switch (evt.name) {
case "spectatorSwitched":
break;
}


Далее эксперементы показали, что необходимо приведение к строковому типу:
switch (String(evt.name)) { }

Делаем вывод - в неоднозначных и странных ситуациях первым делом приводим типы.

2 комментария:

Unknown комментирует...

как и во всех языках программирования, если внимательно читать документацию мы узнаем, что switch делает строгое сравнение (===), а вы делаете обычное (==), в результате чего интерпретатор пытается привести обе переменных к одинаковому типа. в данном случаи String.

Unknown комментирует...

Спасибо за подробность, никогда не придавал значения этой особенности switch, т.к. всегда старался избегать работы с нетипизированными переменными.
Тут же как раз тот случай, когда строгое сравнение === играет злую шутку.
Дело в том, что в других случаях switch в SFS работает как часы. И только тут - споткнулся.
Скорее всего строка приходит в параметр события не как стандартная а какая-нибудь java или как Object. Приводя ее явно к строковому типу, мы вызываем какойнть метод типа toString(), который в свою очередь возвращает правильный тип. Но это догадки...