A clickable visual guide to the Rust type system
### Скалярные типы
- `u8` 0…255
- `i8` -128…127
- `bool` true/false
- `u16`, `i16`, `f32`, `u32`, `i32`, `u64`, `i64`, `f64`, `u128`, `i128`, `usize`, `isize`, `char`
### Составные
- `(T, U)` кортеж
- `struct` именованные поля
- `enum` варианты
- `union` пересекающиеся данные
- `[T; N]` массив фикс. длины
- `()` юнит
### Безразмерные
- `[T]` слайс
- `str` строковый слайс
- `dyn Trait` трейт-объект
- `&[T]`, `&mut [T]`, `&str`, `&mut str`, `&dyn Trait`, `&mut dyn Trait`
### Ссылки
- `&T` shared
- `&mut T` mutable
### Диапазоны
- `a..b`, `..b`, `a..`, `a..=b`, `..=b`, `..`
### Утилиты
- `Option<T>`
- `Result<T, E>`
- `Ordering`
- `Arguments` (format!)
### Асинхронность
- `Poll<T>`
- `Context`
- `Pin<T>`
### Анонимные
- `fn()` item
- `|x| …` closure
- `async fn` / `async ||`
- `impl Trait`
### unsafe
- `UnsafeCell<T>`
- `ManuallyDrop<T>`
- `PhantomData<T>`
### Сырые указатели
- `*const T`, `*mut T`
### Указатели на функции
- `fn(T…) -> U`
### Паника
- `PanicInfo`, `Location`
### Недостижимый
- `!` never
Комментарии (39)
- Пользователи сравнивают визуализацию «Elements of Rust» с периодической таблицей и другими подобными гайдами (например, cosmic.mearie.org), отмечая, что она выглядит красиво на десктопе, но неудобна на мобильных и требует горизонтального скролла.
- Некоторые находят подборку полезной для быстрого погружения, особенно если уже знакомы со статически типизированными языками.
- Критика: «таблица» кажется произвольной в группировке типов, не объясняет, почему важные концепты рядом, и из-за плотности информации может отпугнуть новичков.
- Упоминаются аналоги из C/C++, а также ссылки на другие Rust-гайды, попадавшие на HN.
- Для строковых представлений в стандартной библиотеке есть трейты Display и Debug; сериализация JSON доступна через сторонние крейты (например, serde).
The Core of Rust
Rust — это язык с жёсткой внутренней связностью.
Он не сложен из-за плохой документации, а потому что его концепты переплетены: замыкания, трейты, заимствование, Send/Sync, итераторы и прочие вещи нужны сразу. Поняв их, вы получаете мощный и последовательный инструмент.
Мини-пример.
20 строк кода на Rust, отслеживающие изменения файлов:
use notify::{Watcher, RecursiveMode};
fn main() -> Result<(), notify::Error> {
let mut w = notify::recommended_watcher(|r| {
if let Ok(e) = r {
println!("{:?} {:?}", e.kind, e.paths);
}
})?;
["pages", "templates", "static"].iter()
.try_for_each(|p| w.watch(p.into(), RecursiveMode::Recursive))?;
loop { std::thread::park(); }
}
Даже здесь нужно знать: Result, замыкания, итераторы, трейты Display, 'static, Send.
На JavaScript то же заняло бы 5 строк и не потребовало бы ни трейтов, ни заимствований.
Вывод.
Внутри Rust прячется «меньший, чище» язык с ясным видением: безопасность без сборщика мусора, абстракции без потерь, композиция через трейты. Этот язык появляется, когда все части складываются в единую картину.
Комментарии (108)
- JS-пример из поста содержит несколько багов (null-файл, for-in вместо for-of), которые TypeScript не всегда ловит.
- Автору ставят в вину, что он «забыл» упомянуть async/await, Promise, модули и прочие скрытые концепции JS.
- Комментаторы спорят, можно ли выкинуть из Rust «половину» фич и остаться при этом «малым и чистым»; большинство считает, что нет.
- Многие советуют новичкам не начинать с Rust: компилятор будет целыми днями выдавать ошибки, прежде чем программа запустится.
- Несколько человек упоминают Gleam, Zig и Austral как «упрощённые» альтернативы, но подчёркивают, что это уже другие языки.