Godot
March 11, 2023

Not so INF

GDScript, конечно, весёлая штука.
Это вот знаете шутки про JavaScript, где {} + [] == 0, так и тут

Сделал, короче, функцию get_random_perks(N), которая возвращает N случайных перков. Под капотом оно делает randomized_perks.slice(0, N)

Понадобилось получить оттуда полный список перков. Решил не заморачиваться и сделал get_random_perks(INF). То есть, получается, оно делает .slice(0, INF). На всякий случай завернул в int(INF), чтобы оно точно было целым числом и не упало

На маке всё работало окей. Закинул на комп на винде - стало выдавать 0 перков.

Думаю, чё за хрень? Попутно пофиксил пару фильтров, которые неправильно списывали перки как неподходящие по требованиям. Но всё равно возвращало 0 перков

Оказывается, int(INF) на винде возвращает -9223372036854775808. А на макоси это число 9223372036854775807

Самое весёлое, что в get_random_perks я явно указал тип N - int. И GDScript под капотом использует типы в том числе чтобы сэкономить на памяти. То есть по идее оно должно конвертировать в int даже без явного заворачивания

Но почему-то при явном get_random_perks(int(INF)) оно даёт отрицательное число, а если просто прокинуть - то проходит без ошибок нормальное

Короче, лень написать нормально обернулась парой часов дебага. Но зато пару багов лишних нашёл