Тонкости языка
Собрание мест, где интуиция подводит: сравнения с допуском, пустота вместо бесконечности и объекты, которые равны только сами себе
equal сравнивает с допуском
Заголовок раздела «equal сравнивает с допуском»0.1 + 0.2 в mlog, как и везде, даёт 0.30000000000000004. Но op equal почти 0.3
отвечает единицей: сравнение с допуском — два числа считаются равными, если разница
меньше одной миллионной. Строгое сравнение той же пары даёт ноль.
Тот же пример показывает и остальное: деление на ноль превратилось в пустоту, пустота
оказалась равна нулю по equal и не равна по strictEqual, а медь равна только меди.
| Условие | Как сравнивает |
|---|---|
equal, notEqual |
с допуском в 0.000001 |
strictEqual |
точно, и ещё проверяет тип |
lessThan, greaterThan и прочие |
точно, без допуска |
Отсюда странность: equal может сказать «равны», а lessThan — «меньше», и оба правы.
Деление на ноль даёт пустоту
Заголовок раздела «Деление на ноль даёт пустоту»Ни бесконечности, ни «не числа» в переменных mlog не бывает. Стоит вычислению дать такой ответ — и переменная становится пустой:
op div x 5 0 # x = nullop div y 0 0 # y = nullop sqrt z -4 # z = nullЭто не наша выдумка, а устройство переменной в игре: негодное число она не хранит вовсе и превращается в пустоту.
Пустота в сравнениях
Заголовок раздела «Пустота в сравнениях»| Сравнение | Ответ |
|---|---|
equal null 0 |
1 — в арифметике пустота считается нулём |
strictEqual null 0 |
0 — тип разный |
op add x null 5 |
5 |
print null |
null |
Пустота — не ноль, но ведёт себя как ноль везде, кроме строгого сравнения и печати.
Единственный надёжный способ отличить «нет значения» от «значение ноль» — strictEqual.
Объекты равны только сами себе
Заголовок раздела «Объекты равны только сами себе»Здания, юниты и контент сравниваются по тождеству: equal @copper @copper — единица,
equal @copper @lead — ноль. Никакого «похожи» нет.
С этим связаны две вещи:
- два юнита одного типа не равны. Чтобы сравнить типы, спрашивают
sensor тип @unit @typeи сравнивают уже типы; - здание из
getlinkи то же здание изradar— один и тот же объект, и сравнение их подтвердит.
Строка — это значение, но не число
Заголовок раздела «Строка — это значение, но не число»Строку можно положить в переменную, напечатать, сравнить на равенство и прочитать
посимвольно через read. Чего с ней нельзя —
складывать и сравнивать по порядку:
op add x "abc" 5 # не сложение: строка в арифметике — единицаop lessThan y "abc" 5 # сравнивает не строку, а единицуВ числовых операциях строка ведёт себя как объект: есть — единица, нет — ноль.
Неофициальный проект, с Anuke не связан. Спрайты, шрифты и переводы Mindustry © Anuke, используются по GPL-3.0; Fira Code — по OFL-1.1. Код сайта — GPL-3.0.