Каждый фрагмент ниже запускается без ошибок и на первый взгляд делает то, что должен. Но в каждом сидит баг, который спокойно проходит ревью по диагонали. Попробуйте найти его до того, как откроете спойлер, версии пишите в комментариях 🐱
Python
fees = [lambda amount: amount * rate for rate in (0.01, 0.02)]
print([f(1000) for f in fees])
Ожидаем [10.0, 20.0], получаем [20.0, 20.0]. Lambda запоминает саму переменную rate, а не ее значение в момент создания. К первому вызову цикл уже закончился, и rate у всех равна 0.02. Лечится аргументом по умолчанию: lambda amount, rate=rate: amount * rate
JavaScript
const amounts = [1500, 250, 99, 10000];
const top = amounts.sort().reverse()[0];
console.log(`Самый крупный платеж: ${top}`);
Выведет 99. Без функции сравнения sort() приводит числа к строкам и сортирует по алфавиту, поэтому “10000” оказывается раньше “99”. Бонусом sort() меняет исходный массив, и amounts теперь тоже перемешан. Правильно так: Math.max(…amounts)
Java
Integer limit = 1000;
Integer spent = 1000;
if (spent == limit) {
System.out.println("Лимит исчерпан");
}
Ничего не напечатается. Integer — объект, и == сравнивает ссылки, а не значения. JVM кэширует объекты Integer только в диапазоне -128..127, для 1000 создаются два разных объекта. Самое неприятное здесь в тестах: с limit = 100 все работает, и баг доезжает до прода. Сравнивайте через equals() или используйте int
Какой баг нашли быстрее всего? Делитесь в комментариях багом, который вы сами ловили на проде.
Мы в МАКС 🐱
