Ответы пользователя по тегу Rust
  • Как изменить размер консоли в rust?

    vabka
    @vabka Куратор тега Rust
    Насколько я знаю,в 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 Куратор тега Rust
    Есть хорошая статья: 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 Куратор тега Rust
    Он же нигде в этом коде не используется

    Используется.
    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 Куратор тега Rust
    Что-то ты намудрил с расширениями.
    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 Куратор тега Rust
    "С другими" - это какими?
    И в каком плане совместимость?

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

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

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

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

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

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

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

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

    vabka
    @vabka Куратор тега Rust
    Хз что именно было не так (подозреваю '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 Куратор тега Rust
    Не пудри себе мозги и возьми уже готовую безопасную обёртку над 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 Куратор тега Rust
    std::process::Command
    Находится буквально по запросу: "rust start process"
    Ответ написан
    Комментировать
  • Почему скомпилированный "Hello World", на Rust занимает на диске 10 Мегабайт?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    vabka
    @vabka Куратор тега Rust
    Варианта два:
    1. Можно использовать android studio или intellij idea community с плагином intellij rust
    2. Можно добавить воркспейс для vs code, чтобы отрубались плагины, специфичные для stm32.

    Использовать Kotlin или java всё равно придётся, чтобы склеить rust код и android.
    Советую использовать rust только в критичных для производительности частях.
    Ответ написан