Динамическую диспетчеризацию в 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 уступает почти по всем аспектам, сюжет более невнятный, а одинаковая оранжевая гамма всех уровней надоедает
Нет, зачем нужны аргументы со значениями по умолчанию - понятно, это много где есть. Зачем докидывать undefined, если аргументов недостаточно - неясно. Недостаточное количество аргументов при вызове - это ошибка на вызывающей стороне, а поведение JavaScript способствует тому, чтобы эти ошибки обнаруживались позже, чем надо.
Далеко не всегда для корректного кода на JS тип выводится автоматом.
Если вы пишите на Javascript код, для которого специально построенный для вывода типов инструмент не может вывести типы, то с чего вы считаете, что эти типы будут ясны человеку, который этот код считает?
Нет, дело именно в плюсах. Это настолько кривой язык, что на нём практически невозможно писать безопасно, даже если очень хочется
Динамическую диспетчеризацию в Rust делают через трейт-объекты. Так как сам трейт-объект не является
Sizedтипом, напрямую передавать его нельзя, можно только по указателю. Другое дело, что этот указатель совершенно не обязательно должен быть владеющим. В частности, пример в статье про динамический диспетчер можно написать иначе, без ненужных аллокаций в куче:Причём за счёт deref coercion приводить ссылки явно к
&dyn Processableна вызывающей стороне не требуется.А аргументы будут или это опять голословное утверждение?
А можете привести конкретные примеры?
Rust-код в статье выглядит сильно неоптимальным. Именно, он на каждой внутренней итерации преобразовывает rust-овый
Vecв массив JS, что подразумевает копирование и боксинг данных (каждого отдельного числа), а потом итоговыйVecкопируется ещё раз при переводе в значение Javascript. Это очень много лишних операций. Лучше было бы на стороне Rust предаллоцировать массивы и потом их заполнять - или, ещё лучше, использовать типизированныйFloat64Arrayи избежать конвертации вовсе. Правда, такой типизированный массив придётся делать плоским, что может повлиять на удобство со стороны JavascriptА вот про это можно поподробнее? В чём уступает? Мне на ум только меньший охват целевых платформ приходит.
Всегда можно понизить уровень сложности
А я вот прошёл Doom Eternal первым и потом прошёл Doom 2016 через силу. Потому что в плане геймплея Doom 2016 уступает почти по всем аспектам, сюжет более невнятный, а одинаковая оранжевая гамма всех уровней надоедает
Вот только ничего из этого в Hare нет.
Автора почему-то тотально удалили с Хабра. Вот ссылка на копию в web archive
Нет, зачем нужны аргументы со значениями по умолчанию - понятно, это много где есть. Зачем докидывать undefined, если аргументов недостаточно - неясно. Недостаточное количество аргументов при вызове - это ошибка на вызывающей стороне, а поведение JavaScript способствует тому, чтобы эти ошибки обнаруживались позже, чем надо.
А можете рассказать, как это на практике помогает в разработке?
Если вы пишите на Javascript код, для которого специально построенный для вывода типов инструмент не может вывести типы, то с чего вы считаете, что эти типы будут ясны человеку, который этот код считает?
Угу, вот только:
в других языках программирования map принимает передаёт в отображающую функцию лишь один аргумент - текущий элемент.
в Javascript недостаточное количество аргументов при вызове не вызывает ошибку, а докидывает undefined.
Зачем это сделано и как это помогает разработчику - вопрос открытый
Фича для написания багов, ага
Или, что гораздо вероятнее, ту переписывал однопоточный код на многопоточный и упустил все места, где доступ осуществляется из нескольких потоков.
Без статического анализатора, который проверяет следование этим правилам, толку от них довольно мало.
Коллега, вы делаете мне больно своим кодом. Можно же без аллокации вектора
char-ов и без лишней мутабельности:А если конструктор по умолчанию дорогой?