А у нас новая рубрика — #Накодь!
Сегодня — код на JavaScript с ошибкой(а может, и нет 😀 ) . Кто увидел, где она и как её можно решить — ждём в комментариях🔥
А завтра поделимся вариантами решения от Василия Беляева, нашего руководителя группы разработки интерфейсов!
Сегодня — код на JavaScript с ошибкой
А завтра поделимся вариантами решения от Василия Беляева, нашего руководителя группы разработки интерфейсов!
Please open Telegram to view this post
VIEW IN TELEGRAM
В карточках оставили решение вчерашней ошибки
Экспертизой поделился Василий Беляев, руководитель группы разработки интерфейсов в «Криптоните».
Если понравилась эта задачка, то обязательно посмотрите вот это видео (смотреть). Там Василий разбирает задачи «Палиндром», «Поворот матрицы» и «Подсчёт элементов в списке» — их часто дают на собеседовании. #javascript
📌 Если понравилась наша новая рубрика #накодь, то обязательно ставьте 🖤 . Мы разберём ошибки других языков программирования.
Uncaught TypeError: this.clearHistory is not a function
Экспертизой поделился Василий Беляев, руководитель группы разработки интерфейсов в «Криптоните».
Если понравилась эта задачка, то обязательно посмотрите вот это видео (смотреть). Там Василий разбирает задачи «Палиндром», «Поворот матрицы» и «Подсчёт элементов в списке» — их часто дают на собеседовании. #javascript
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
А вот и вариант решения вчерашней ошибки — читайте карточки🖤
Их нам помог составить Александр Авраменко, руководитель направления системного программирования в «Криптоните» .
Типичные ошибки какого языка программирования смотрим дальше? #накодь
Их нам помог составить Александр Авраменко, руководитель направления системного программирования в «Криптоните» .
Типичные ошибки какого языка программирования смотрим дальше? #накодь
Please open Telegram to view this post
VIEW IN TELEGRAM
В нашем канале обновились рубрики — собрали их актуальный список в одном посте: нажимайте на тэги и читайте только то, что интересно вам❤️
🔹 #нейрословарь — разбираем термины из мира нейронных сетей;
🔹 #на_ноль_делить_нельзя — рассказываем о неочевидных математических фактах;
🔹 #накодь — постим код с ошибкой, а потом рассказываем, как её решить;
🔹 #история_математики — рассказываем про необычные математические приборы и ЭВМ прошлого;
🔹 #Криптонит_говорит — делаем наш айтишный подкаст;
🔹 #языки_программирования — сделали обзоры Java, JavaScript, Python, C++, Golang, Scala, Rust, Spark и продолжаем рассказывать о трендах;
🔹 #научные_статьи — ломаем мозг над сложными статьями сотрудников «Криптонита»;
🔹 #задачки — решаем задачки на логику и математику;
🔹 #вакансии_Криптонит — приглашаем присоединиться к нашей команде;
🔹 #новости_Криптонит — рассказываем, чем живёт компания;
🔹 #мнения_экспертов — делимся мыслями наших экспертов на актуальные темы;
🔹 #подборки — собираем в одном месте ресурсы для специалистов разных областей ИТ;
🔹 #цитаты_вдохновляют — делимся мыслями известных людей;
🔹 #интервью — наши сотрудники рассказывают о профессиональном пути и трендах отрасли;
🔹 #Криптонит_объясняет — рассказываем просто насколько это возможно о сложных терминах и понятиях.
🔹 #ИЯП — изучаем языки программирования прошлого;
🔹 #криптословарь — объясняем основные криптографические термины.
Please open Telegram to view this post
VIEW IN TELEGRAM
А вот и объяснение вчерашней задачи по Scala! #накодь
А у нас новая ошибка на Scala в нашей рубрике #накодь
В чём проблема в коде ниже? Ждём ответы в комментариях!⬇️
В чём проблема в коде ниже? Ждём ответы в комментариях!
object UnitError {
def printMsg(message: String): Unit = {
println(message)
}
def process(data: List[Int]): List[Unit] = {
for (element <- data) yield {
printMsg(s"Элемент: $element")
}
}
def main(args: Array[String]): Unit = {
val nums = List(1, 2, 3)
val res = process(nums)
println(s"Результат: $res") // Вывод List[Unit] даёт неожиданный результат
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
Правильный код и объяснение вчерашней ошибки #накодь
🔴 Ошибка заключается в неверной конструкции при использовании функции process. Она возвращает пустые значения: List((), (), ()). Происходит это потому, что yield собирает результаты каждой итерации. В итоге получается список, состоящий из пустых значений Unit — по одному на каждый элемент в data.
❗️ Unit в Scala — это аналог void в Java и Си-подобных языках, означающий пустое значение. В данном примере yield собирает результаты printMsg(...), которые все являются Unit (пустыми).
Программисты, привыкшие к императивным языкам и переходящие на Scala, интуитивно ожидают, что такая конструкция будет возвращать какие-то преобразованные данные, например — как это делает map в JavaScript. То есть, начинающие скалисты могут ожидать здесь на выходе список элементов, а получат пустой вывод.
Исправление
Если требуется вернуть список преобразованных значений, тогда нужно использовать эти значения в yield.
📌 Решение этой ошибки нам помогли составить «скалисты» из команды инженеров данных в «Криптоните». И если это сообщение читают студенты и старшеклассники, то у вас есть классный шанс узнать, что это за профессия и как стать дата-инженером.
Приходите 27 апреля в 14:00 в Музей криптографии — эксперты из «Криптонита», билайна и других брендов подробнее расскажут об этой профессии.
Зарегистрироваться
Программисты, привыкшие к императивным языкам и переходящие на Scala, интуитивно ожидают, что такая конструкция будет возвращать какие-то преобразованные данные, например — как это делает map в JavaScript. То есть, начинающие скалисты могут ожидать здесь на выходе список элементов, а получат пустой вывод.
Исправление
Если требуется вернуть список преобразованных значений, тогда нужно использовать эти значения в yield.
def printMsg(message: String): String = { // Теперь возвращает String
println(message)
message // Возвращает саму строку
}
def process(data: List[Int]): List[String] = { // Теперь функция возвращает List[String]
for {
element <- data
} yield {
printMsg(s"Обрабатываем элемент: $element") // Теперь выводится результат String
}
}
Приходите 27 апреля в 14:00 в Музей криптографии — эксперты из «Криптонита», билайна и других брендов подробнее расскажут об этой профессии.
Зарегистрироваться
Please open Telegram to view this post
VIEW IN TELEGRAM
Вы просили — мы сделали! Новая ошибка из рубрики #накодь — теперь на языке С++!
Итак, есть ли тут проблема кроме narrowing conversion? Ждём ваши варианты в комментариях.
Итак, есть ли тут проблема кроме narrowing conversion? Ждём ваши варианты в комментариях.
#include <cstdint>
#include <vector>
struct Type
{
Type(uint16_t, uint32_t = {})
{}
};
int main()
{
std::vector<Type> vector;
std::uint32_t object_id{};
// Есть предупреждение о narrowing conversion
vector.insert(vector.begin(), {0, object_id});
// Нет narrowing conversion
vector.push_back({0, object_id});
// Нет narrowing conversion
vector.insert(vector.begin(), Type{0, object_id});
}
Рассказываем, где же притаилась ошибка во вчерашнем коде.
Проблема в том, что в строке
в вектор вставляется 2 элемента типа Type, а не один, как ожидает программист.
❗️ Причина в том, что метод insert у вектора имеет перегрузку (номер 5), которая вторым параметром принимает std::initializer_list. А компилятор, видя фигурные скобки в коде, в первую очередь пытается создать объект такого типа.
И тут ему это удается, потому что у конструктора Type второй параметр имеет значение по умолчанию, следовательно, Type умеет создаваться, если в конструктор передали только один аргумент. В итоге компилятор успешно создает std::initializer_list с двумя элементами типа Type.
Так как создание std::initializer_list выполняется с использованием uniform initialization, то компилятор следит за корректностью преобразований. В примере объект типа std::uint32_t передается в конструктор Type, который принимает первым параметром std::uint16_t. То есть, возникает риск потери точности (32 бита не могут поместиться в 16 бит).
📌 Об этом компилятор и предупреждает. Вот упрощенный пример, где видим то же самое предупреждение.
Может возникнуть вопрос, почему создание Type от 0 не вызывает предупреждение, ведь 0 - это int, а он, скорее всего 32 бита и тоже не помещается в 16 бит. Но тут литерал. Компилятор видит, что 0 вмещается в 16 бит и не предупреждает. Но если поместить int в переменную, то также возникает предупреждение.
🔹 Эту ошибку для рубрики #накодь и объяснение нам помогли сделать коллеги из направления системного программирования в «Криптоните».
Проблема в том, что в строке
vector.insert(vector.begin(), {0, object_id});
в вектор вставляется 2 элемента типа Type, а не один, как ожидает программист.
И тут ему это удается, потому что у конструктора Type второй параметр имеет значение по умолчанию, следовательно, Type умеет создаваться, если в конструктор передали только один аргумент. В итоге компилятор успешно создает std::initializer_list с двумя элементами типа Type.
Так как создание std::initializer_list выполняется с использованием uniform initialization, то компилятор следит за корректностью преобразований. В примере объект типа std::uint32_t передается в конструктор Type, который принимает первым параметром std::uint16_t. То есть, возникает риск потери точности (32 бита не могут поместиться в 16 бит).
Может возникнуть вопрос, почему создание Type от 0 не вызывает предупреждение, ведь 0 - это int, а он, скорее всего 32 бита и тоже не помещается в 16 бит. Но тут литерал. Компилятор видит, что 0 вмещается в 16 бит и не предупреждает. Но если поместить int в переменную, то также возникает предупреждение.
Please open Telegram to view this post
VIEW IN TELEGRAM