Ответы пользователя по тегу Rust
  • Какой объем знаний и навыков нужно для того чтобы стать middle Rust разработчиком?

    vabka
    @vabka
    Токсичный шарпист
    Сейчас редко нанимают чистых растаманов, тк язык молодой.
    Обычно нанимают тех, кто переходит с других, более традиционных языков.
    Так что тебе сначала надо стать мидлом/сеньором в C++/Java/C#/C а потом дотянуть знания раста, чтобы уметь на нём решать задачи, аналогичные тем, которые ты решаешь с основным языком.

    Ну и соответствующий коммерческий опыт ~5 лет.
    Учитывай ещё и специфику Rust-проектов: это что-то новое, что требует безопасности и эффективности, где нельзя/нежелательно/невозможно использовать "Традиционные" языки.
    Так что и уровень ответственности и требуемых знаний будет выше, чем на аналогичную, например Java-позицию.
    Ответ написан
    1 комментарий
  • Как изменить размер консоли в rust?

    vabka
    @vabka
    Токсичный шарпист
    Насколько я знаю,в c++ несколькими строчками можно задать размер открываемой консоли в пикселях.

    Но только на винде и только с использованием виндовых API, и работать это будет только со старой консолью.
    Для этого есть крейт windows - https://crates.io/crates/windows
    Использовать следует функцию SetConsoleWindowInfo (или какую там ты использовал функцию?):
    https://docs.microsoft.com/en-us/windows/console/s...

    Либо альтернативный вариант, для новой консоли, но уже не в пикселях, а в колонках:
    https://docs.microsoft.com/en-us/windows/console/c...
    Просто пиши в консоль соответствующую последовательность символов (ну или используй какую-нибудь абстракцию типа crossterm или termion)
    Ответ написан
    1 комментарий
  • Зачем писать .to_string() при объявлении строки?

    vabka
    @vabka
    Токсичный шарпист
    Есть хорошая статья: https://habr.com/ru/post/274485/

    У строковых литералов тип &'static str. Тоесть это заимствованная ссылка на объект с неограниченным временем жизни.
    А to_string возвращает уже owned строку типа std::string::String

    А нужно это в данном коде, чтобы показать механику владения, что очевидно нельзя, если никто не является владельцем значений, как в случае со ссылками.

    Если ты хочешь получить именно String из строкового литерала, то есть сразу несколько вариантов, включая показанный:
    let a: String = String::from("a");
    let b: String = "b".to_string();
    let c: String = "c".into(); // или "c".into::<String>(), если не указывать тип явно.
    let d: String = "d".to_owned();
    Ответ написан
    Комментировать
  • Зачем в Rust fn main() -> io::Result{ писать вот так?

    vabka
    @vabka
    Токсичный шарпист
    Он же нигде в этом коде не используется

    Используется.
    use std::io;
     
    fn main()  -> io::Result<()>{
         
        let mut input = String::new();
        println!("Введите свое имя: ");
        io::stdin().read_line(&mut input)?; // Тут
        println!("Ваш имя: {}", input);
         
        Ok(()) // И тут
    }
    Ответ написан
    2 комментария
  • Как дебажить Rust в vscode?

    vabka
    @vabka
    Токсичный шарпист
    Что-то ты намудрил с расширениями.
    1. Rust-analyzer нельзя сочетать с обычным Rust-плагином.
    2. Вместо пака расширений лучше самому всё по отдельности ставить.
    Для отладки нужно lldb расширение.

    После этого rust-analyzer сам создаст тебе конфиг для отладки, при первой попытке дебага.

    Чуть более подробное решение из моего коммента

    WasTabon, в общем вот список моих екстеншенов (копировал extension id чтобы легко можно было найти):
    • vadimcn.vscode-lldb (для отладки)
    • bungcip.better-toml (чтобы была подсветка в cargo.toml)
    • serayuzgur.crates (для автодополнения имён и версий пакетов)
    • matklad.rust-analyzer (самое главное)
    • swellaby.vscode-rust-test-adapter (чтобы тесты запускать через боковую панель)
    • jscearcy.rust-doc-viewer (чтобы документацию удобнее смотреть)

    Все остальные расширения советую удалить дабы точно не было конфликтов.
    Вот мои файлы когда только создал проект:
    61e318cebdcb5121332621.png
    Rust-analyzer сразу добавил линзу "Debug" около мейна, жму на неё.
    61e31954758f4949494249.png
    И вот результат, всё работает:
    61e31968d2461592787549.png

    PS:
    ❯ cargo -V
    cargo 1.58.0 (7f08ace4f 2021-11-24)
    ❯ rustup toolchain list
    stable-x86_64-pc-windows-msvc (default)

    PPS: о launch.json
    Вот тут есть вполне очевидная кнопка/ссылка "create a launch.json file"
    61e319fccc515317499730.png
    При её нажатии возникает вполне понятный вопрос:
    61e31a574f1fc385427254.png
    Если на него ответить "Yes", то в папке .vscode появится файл launch.json с вот таким содержимым:
    {
        // Use IntelliSense to learn about possible attributes.
        // Hover to view descriptions of existing attributes.
        // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
        "version": "0.2.0",
        "configurations": [
            {
                "type": "lldb",
                "request": "launch",
                "name": "Debug executable 'rust-demo'",
                "cargo": {
                    "args": [
                        "build",
                        "--bin=rust-demo",
                        "--package=rust-demo"
                    ],
                    "filter": {
                        "name": "rust-demo",
                        "kind": "bin"
                    }
                },
                "args": [],
                "cwd": "${workspaceFolder}"
            },
            {
                "type": "lldb",
                "request": "launch",
                "name": "Debug unit tests in executable 'rust-demo'",
                "cargo": {
                    "args": [
                        "test",
                        "--no-run",
                        "--bin=rust-demo",
                        "--package=rust-demo"
                    ],
                    "filter": {
                        "name": "rust-demo",
                        "kind": "bin"
                    }
                },
                "args": [],
                "cwd": "${workspaceFolder}"
            }
        ]
    }

    Тут у нас появляется две конфигурации - одна для запуска приложения, а другая для запуска тестов.
    61e31abfa7315157464415.png
    Работает эта шняга абсолютно также, как показал выше.
    UPD: оформил в виде статьи https://habr.com/ru/post/645797/
    Ответ написан
  • Можно ли использовать fltk в связке с другими библиотеками rust?

    vabka
    @vabka
    Токсичный шарпист
    "С другими" - это какими?
    И в каком плане совместимость?

    В общем случае - у тебя не должны другие библиотеки ломаться, когда ты добавляешь в зависимость любую другую библиотеку.

    По крайней мере в самом fltk не говорится о том что она что-то ломает. И наоборот.
    Так что тестируй
    Ответ написан
    Комментировать
  • Что выбрать gtk или fltk для написания gui на rust?

    vabka
    @vabka
    Токсичный шарпист
    Я бы смотрел в сторону html/css, тут есть два варианта:
    azul - быстрый и эффективный по памяти, использует тот же рендер, что и Firefox. Не нужно копаться в js
    tauri - проще, можно визуал делать на любом удобном js-фреймворке + из коробки есть инструменты для создания установщиков для всех платформ и автообновлений (но за это платишь сравнительно большим расходом оперативки)

    Если хочется поверх GTK - druid или vgtk - это лучше чем голые биндинги.
    Ещё есть SixtyFPS - по описанию тоже прикольно. На десктопе использует нативные контролы, но там сложности с лицензией (похоже на Qt, где опенсорс бесплатный, а коммерческую лицензию надо покупать)
    Удобных либ для работы с Qt не нашёл.

    В общем - отталкивайся от задачи, на сколько сложный UI ты хочешь делать.
    Ответ написан
    Комментировать
  • Насколько хорошо подходит Rust для Embedded систем, например модули для wifi роутеров?

    vabka
    @vabka
    Токсичный шарпист
    Уже можно его брать за основу для продукта или это будет "плакали - кололись и продолжали жевать"?

    Сейчас в целом всё ок, но иногда будет "плакали кололись", особенно если используется какая-то периферия или чип, для которых ещё не написаны готовые библиотеки (или они устарели).
    Ну это по моим ощущениям, тк я пока глубоко не залазил. Со всякими популярными штуками типа stm32-discovery всё ок.
    Ответ написан
    Комментировать
  • Можно ли перевести код из Rust в Python?

    vabka
    @vabka
    Токсичный шарпист
    В принципе, в общем случае вы можете из раста вызвать интерпретатор питона, а из питона - исполняемый файл или библиотеку, написанную на расте.
    Ответ написан
    Комментировать
  • Как скачать файл по прямой ссылке?

    vabka
    @vabka
    Токсичный шарпист
    Хз что именно было не так (подозреваю 'add missing generic argument')
    Но вот это работает:
    use std::{fs::OpenOptions, io::Write, path::Path};
    #[tokio::main]
    async fn main() -> Result<(), Box<dyn std::error::Error>> {
        let target = "https://www.rust-lang.org/static/images/rust-logo-blk.svg";
        let response = reqwest::get(target).await?;
    
        let path = Path::new("./image.svg");
        let mut file = OpenOptions::new().create(true).write(true).open(path)?;
        let content = response.text().await?;
        file.write_all(content.as_bytes())?; // Хочу асинхронно писать в файлы. Как это можно сделать?
        Ok(())
    }

    Пример брал из документации reqwest
    Ответ написан
    1 комментарий
  • Существуют ли фреймворки, позволяющие писать бекенд на rust+javascript?

    vabka
    @vabka Куратор тега Веб-разработка
    Токсичный шарпист
    Фреймворков таких нет, и не понятно, зачем.

    В принципе на бэкенде можно использовать ffi/обёртки над v8/wasm/ всякие RPC поверх чего-угодно, но это всё будут самодельные решения, а не фреймворки.
    Ответ написан
  • Rust unsafe, какие есть подводные камни и как подходить к дизайну C API?

    vabka
    @vabka
    Токсичный шарпист
    Не пудри себе мозги и возьми уже готовую безопасную обёртку над raylib
    https://crates.io/crates/raylib

    А гайд по работе с unsafe - это rustonomicon

    unsafe сам по себе просто позволяет использовать сырые указатели + вызывать другие unsafe функции.

    Безопасная обётка - это когда ты при помощи типов и всяких валидаций гарантируешь корректное использование.
    Вот пример из того что выше:
    use raylib::prelude::*;
    
    fn main() {
        let (mut rl, thread) = raylib::init()
            .size(640, 480)
            .title("Hello, World")
            .build();
    
        while !rl.window_should_close() {
            let mut d = rl.begin_drawing(&thread);
    
            d.clear_background(Color::WHITE);
            d.draw_text("Hello, world!", 12, 12, 20, Color::BLACK);
        }
    }

    Если для вас это магия, то тогда нужно чуть глубже изучить Rust и посмотреть в исходники.

    На будущее: не пишите огромную портянку текста с кучей вопросов, а пишите только то что непосредственно относится к основному вопросу.
    Другие вопросы задавайте отдельно.
    Ответ написан
    Комментировать
  • Как запустить bat файл из кода Rust?

    vabka
    @vabka
    Токсичный шарпист
    std::process::Command
    Находится буквально по запросу: "rust start process"
    Ответ написан
    Комментировать
  • Почему скомпилированный "Hello World", на Rust занимает на диске 10 Мегабайт?

    vabka
    @vabka
    Токсичный шарпист
    Почему нельзя было сделать как в python, один раз установил либру, пользуешься везде!

    Хрен его знает. Rust тут не одинок.
    У обоих подходов есть свои плюсы и минусы
    то она будет скачана и скомпилирована, а затем в другом проекте мне понадобится таже библиотека, и в итоге она будет опять скачена и скомпилина,

    Компиляция нужна, тк растовый компилятор делает глубокие оптимизации под каждый проект, которые тиебуют наличия исходников.

    Почему скомпилированный «Hello World», на Rust занимает на диске 10 Мегабайт?

    Зависит от параметров. Скорее всего что-то из этого в разных сочетаниях:
    1. Много кода, включая зависимости
    2. Собрано без оптимизаций по размеру
    3. Включена информация для отладчика
    Ответ написан
  • С чего начать изучение языка?

    vabka
    @vabka
    Токсичный шарпист
    Почему не rustbook?
    Для его понимания никакой ЯП знать не нужно
    Ответ написан
    Комментировать
  • Можете накидать идеи для проектов на rust?

    vabka
    @vabka
    Токсичный шарпист
    Берёшь ответ из своего старого вопроса: Идеи для проекта на java spring?
    И реализуешь на расте.
    Ответ написан
    Комментировать
  • Хайп вокруг ЯП Rust и C?

    vabka
    @vabka
    Токсичный шарпист
    По порядку:
    Насколько критичной проблемой для программиста является ручное управление памятью, которое называют недостатком языка Си?

    С неправильным управлением памятью связано очень много ошибок. Например в хроме вроде около половины CVE с этим связано. Ещё можно вспомнить HeartBleed в OpenSSL, который тоже связан с неправильным управлением памятью.

    (Дальше какое-то ужасно длинное предложение, которое я разбил на части)
    Новый язык программирования Раст, как заявляют, лишен этого недостатка

    Да
    разве общее число ошибок не перераспределяется на другие недостатки

    1. Самые сложные в исправлении ошибки - кривое управление памятью и многопоточность, обе их Rust Решает
    2. Нет, ошибки не перераспределяются, это же не тараканы.
    являются ли ошибки с памятью ошибками программиста

    Если управление памятью ручное, то это ошибки, которые допустил разработчик.
    Если управление памятью автоматическое (хоть через GC, хоть через Borrow checker), то это ошибка компилятора/рантайма/языка.

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

    Не обязательно.

    В целом вопрос очень абстрактный и является скорее поводом для дискуссий. Попробуйте дать более конкретный пример, где ошибка управления памятью превращается в какую-то другую ошибку.
    Ответ написан
    Комментировать
  • Как разбить вектор на подвектора разной длинны?

    vabka
    @vabka
    Токсичный шарпист
    Если вы не собираетесь менять данные - можно создать новый вектор из readonly-срезов
    Отдельная задача - нахождение индексов, где ломается сортированность (не помню, как это называется, но у этого есть термин)
    Точки эти можно найти простым циклом, в пределах которого как раз можно создавать срезы и пушить в новый вектор.
    Потом по этому вектору со срезами делаешь map и sum
    Ответ написан
  • Что такое крейт?

    vabka
    @vabka
    Токсичный шарпист
    Читайте Cargo book
    Крейт == пакет.
    Да, написаны они всегда на rust, но могут являться обёртками над сишными библиотеками, например.
    Деления на официальные и неофициальные нет - все они ставятся с crates.io или с другого репозитория.
    Чтобы установить, надо просто указать его в зависимостях.
    Всё это описано в rustbook
    Ответ написан
    7 комментариев
  • Пример использования usb в микроконтроллере на rust?

    vabka
    @vabka
    Токсичный шарпист
    usb-device - это базовый крейт, который имеет абстракцию USB-устройства, к нему есть реализации под разные HAL, в том числе stm32.
    Поверх него есть реализации например HID - usbd-hid
    Ответ написан
    Комментировать