Перейти к содержимому

Тонкости языка

Собрание мест, где интуиция подводит: сравнения с допуском, пустота вместо бесконечности и объекты, которые равны только сами себе

0.1 + 0.2 в mlog, как и везде, даёт 0.30000000000000004. Но op equal почти 0.3 отвечает единицей: сравнение с допуском — два числа считаются равными, если разница меньше одной миллионной. Строгое сравнение той же пары даёт ноль.

Тот же пример показывает и остальное: деление на ноль превратилось в пустоту, пустота оказалась равна нулю по equal и не равна по strictEqual, а медь равна только меди.

тик 0
Операция0
=
Операция1
=
Операция2
=
Операция3
=
Операция4
=
Операция5
=
Операция6
=
Операция7
=
Стоп8
@counter0number
почтиnullnull
сДопускомnullnull
строгоnullnull
наНольnullnull
пустоеРавноНулюnullnull
пустоеСтрогоnullnull
медьРавнаМедиnullnull
медьРавнаСвинцуnullnull
Условие Как сравнивает
equal, notEqual с допуском в 0.000001
strictEqual точно, и ещё проверяет тип
lessThan, greaterThan и прочие точно, без допуска

Отсюда странность: equal может сказать «равны», а lessThan — «меньше», и оба правы.

Ни бесконечности, ни «не числа» в переменных mlog не бывает. Стоит вычислению дать такой ответ — и переменная становится пустой:

op div x 5 0 # x = null
op div y 0 0 # y = null
op 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.