Pull to refresh
44
0

Типострадалец

Send message

Нет, дело именно в плюсах. Это настолько кривой язык, что на нём практически невозможно писать безопасно, даже если очень хочется

безотносительно "полезности" и адекватности этих вещей, если начать перечислять чего нет в плюсах, то можно до вечера тут сидеть

Динамическую диспетчеризацию в Rust делают через трейт-объекты. Так как сам трейт-объект не является Sized типом, напрямую передавать его нельзя, можно только по указателю. Другое дело, что этот указатель совершенно не обязательно должен быть владеющим. В частности, пример в статье про динамический диспетчер можно написать иначе, без ненужных аллокаций в куче:

// такие же определения Processable, а также DataA, DataB и реализаций Processable для них

fn dynamic_processing(item: &dyn Processable) {
    item.process();
}

let a = DataA;
let b = DataB;

dynamic_processing(&a); // Выведет "DataA обрабатывается"
dynamic_processing(&b); // Выведет "DataB обрабатывается"

Причём за счёт deref coercion приводить ссылки явно к &dyn Processable на вызывающей стороне не требуется.

А аргументы будут или это опять голословное утверждение?

долгоживущий стейт, на который нужны референсы из нескольких мест, не дай бог еще и циклические (а на низком уровне, на самом деле, этого весьма дохрена)

А можете привести конкретные примеры?

Rust-код в статье выглядит сильно неоптимальным. Именно, он на каждой внутренней итерации преобразовывает rust-овый Vec в массив JS, что подразумевает копирование и боксинг данных (каждого отдельного числа), а потом итоговый Vec копируется ещё раз при переводе в значение Javascript. Это очень много лишних операций. Лучше было бы на стороне Rust предаллоцировать массивы и потом их заполнять - или, ещё лучше, использовать типизированный Float64Array и избежать конвертации вовсе. Правда, такой типизированный массив придётся делать плоским, что может повлиять на удобство со стороны Javascript

...после ленивой годичной практики языка, я все же был вынужден заключить, что в разрезе embedded программирования (где можно и нужно активно использовать программирование времени компиляции) Rust не только не делает качественно скачка вперед, но и даже в чем-то уступает C++ в 2024 году.

А вот про это можно поподробнее? В чём уступает? Мне на ум только меньший охват целевых платформ приходит.

Всегда можно понизить уровень сложности

А я вот прошёл Doom Eternal первым и потом прошёл Doom 2016 через силу. Потому что в плане геймплея Doom 2016 уступает почти по всем аспектам, сюжет более невнятный, а одинаковая оранжевая гамма всех уровней надоедает

Новые интересные концепции, языковые конструкции, приемы, устранение недостатков старых языков...

Вот только ничего из этого в Hare нет.

Автора почему-то тотально удалили с Хабра. Вот ссылка на копию в web archive

Нет, зачем нужны аргументы со значениями по умолчанию - понятно, это много где есть. Зачем докидывать undefined, если аргументов недостаточно - неясно. Недостаточное количество аргументов при вызове - это ошибка на вызывающей стороне, а поведение JavaScript способствует тому, чтобы эти ошибки обнаруживались позже, чем надо.

Можно самому писать довольно хитрые алгоритмы наследования

А можете рассказать, как это на практике помогает в разработке?

Далеко не всегда для корректного кода на JS тип выводится автоматом.

Если вы пишите на Javascript код, для которого специально построенный для вывода типов инструмент не может вывести типы, то с чего вы считаете, что эти типы будут ясны человеку, который этот код считает?

Угу, вот только:

  • в других языках программирования map принимает передаёт в отображающую функцию лишь один аргумент - текущий элемент.

  • в Javascript недостаточное количество аргументов при вызове не вызывает ошибку, а докидывает undefined.

Зачем это сделано и как это помогает разработчику - вопрос открытый

Фича для написания багов, ага

Если ты полез в массив из разных потоков одновременно - значит, ты ЗНАЕШЬ, что делаешь.

Или, что гораздо вероятнее, ту переписывал однопоточный код на многопоточный и упустил все места, где доступ осуществляется из нескольких потоков.

Без статического анализатора, который проверяет следование этим правилам, толку от них довольно мало.

Коллега, вы делаете мне больно своим кодом. Можно же без аллокации вектора char-ов и без лишней мутабельности:

impl FromStr for Address {
    type Err = ParseAddressError;

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        let &[col, row] = s.as_bytes() else {
            return Err(ParseAddressError);
        };

        let col = match col {
            b'a'..=b'h' => col - b'a',
            b'A'..=b'H' => col - b'A',
            _ => return Err(ParseAddressError),
        };

        let row = match row {
            b'1'..=b'8' => row - b'1',
            _ => return Err(ParseAddressError),
        };

        Ok(Self { col, row })
    }
}

А если конструктор по умолчанию дорогой?

Information

Rating
Does not participate
Registered
Activity