Задать вопрос
Ответы пользователя по тегу Rust
  • Есть ли фреймворк для кроссплатформенной разработки на Rust с компиляцией в нативные приложения?

    vabka
    @vabka Куратор тега Rust
    Slint?
    https://docs.slint.dev/latest/docs/slint/
    Но после веба он не очень удобный.
    Зато кроме десктопа и мобилок умеет в ембедед.

    И помни про существование https://areweguiyet.com/
    Ответ написан
    Комментировать
  • Как внести данные из приложения AXUM в вектор?

    vabka
    @vabka Куратор тега Rust
    Кажется, ты просто в своих же типах запутался. Всё работает (ниже работающий код)

    Подскажите, пожалуйста, как исправить код и есть ли разные решения с точки зрения скорости работы для случаев:
    - такой вектор только читают
    - вектор читают и изменяют.

    Если только читают, то 1 раз его проинициализировал, а в стейте пусть лежит Arc без mutex.
    Если и читают и пишут, то RwLock, но стоит подумать над структурами данных, тк у тебя ради добавления одной записи блокируется весь список. Что-нибудь на основе связных списков например позволит не блочить весь вектор.

    use axum::extract::State;
    use axum::http::StatusCode;
    use axum::routing::{get, post};
    use axum::{Json, Router};
    use serde::{Deserialize, Serialize};
    use std::sync::{Arc, Mutex};
    
    #[derive(Debug, Clone)]
    struct AppState {
        d: Arc<Mutex<Vec<String>>>,
    }
    
    #[tokio::main]
    async fn main() -> Result<(), Box<dyn std::error::Error>> {
        let state = AppState {
            d: Arc::new(Mutex::new(vec![])),
        };
    
        let app = Router::new()
            .route("/info", post(create_user))
            .route("/list_users", get(list_users))
            .with_state(state);
    
        let listener = tokio::net::TcpListener::bind("127.0.0.1:3000")
            .await
            .unwrap();
        axum::serve(listener, app).await.unwrap();
    
        Ok(())
    }
    
    #[derive(Deserialize)]
    pub struct FromBrowser {
        username: String,
    }
    
    #[derive(Serialize)]
    pub struct User {
        username: String,
    }
    
    async fn create_user(
        State(state): State<AppState>,
        Json(payload): Json<FromBrowser>,
    ) -> (StatusCode, Json<User>) {
        // ...
        let user = User {
            username: payload.username,
        };
    
        {
            let mut d = state.d.lock().expect("mutex was poisoned");
            d.push(user.username.to_owned());
        }
        println!("state = {:?}", state);
        (StatusCode::CREATED, Json(user))
    }
    
    async fn list_users(State(state): State<AppState>) -> (StatusCode, Json<Vec<String>>) {
        let users = state.d.lock().expect("mutex was poisoned").clone();
        (StatusCode::OK, Json(users))
    }
    Ответ написан
    1 комментарий
  • Как удалить таблицу из базы postgresql, подставляя имя из переменной?

    vabka
    @vabka Куратор тега Rust
    Имя таблицы как параметр нельзя передать.
    Используй format! или concat!
    Ответ написан
    3 комментария
  • Как проверить збч на примере игральной кости, не ожидая миллиона лет?

    vabka
    @vabka Куратор тега Rust
    1. всё-таки не bones, а dice
    2. (3..4).contains(&b)
    Это то же самое, что и 3==b
    16% - это как раз почти 1/6, так что всё сходится

    UPD: оказывается, dice - это и есть множественное число, так что dices - это тоже неправильно
    Ответ написан
    5 комментариев
  • Как решить задачу rustlings?

    vabka
    @vabka Куратор тега Rust
    В оригинале задача выглядит так:
    #[derive(Debug, PartialEq, Eq)]
    enum DivisionError {
        // Example: 42 / 0
        DivideByZero,
        // Only case for `i64`: `i64::MIN / -1` because the result is `i64::MAX + 1`
        IntegerOverflow,
        // Example: 5 / 2 = 2.5
        NotDivisible,
    }
    
    // TODO: Calculate `a` divided by `b` if `a` is evenly divisible by `b`.
    // Otherwise, return a suitable error.
    fn divide(a: i64, b: i64) -> Result<i64, DivisionError> {
        todo!();
    }
    
    // TODO: Add the correct return type and complete the function body.
    // Desired output: `Ok([1, 11, 1426, 3])`
    fn result_with_list() {
        let numbers = [27, 297, 38502, 81];
        let division_results = numbers.into_iter().map(|n| divide(n, 27));
    }
    
    // TODO: Add the correct return type and complete the function body.
    // Desired output: `[Ok(1), Ok(11), Ok(1426), Ok(3)]`
    fn list_of_results() {
        let numbers = [27, 297, 38502, 81];
        let division_results = numbers.into_iter().map(|n| divide(n, 27));
    }


    В таком случае это вполне является допустимым и корректным решением (код из вопроса):
    fn result_with_list() -> Result<Vec<i64>, DivisionError> {
        let numbers: [i64; 4] = [27, 297, 38502, 81];
    
        let division_results: Result<Vec<i64>, DivisionError> = numbers
            .into_iter()
            .map(|n| divide(n, 27))
            .collect();
    
        division_results
    }


    PS: изначально ответ писал ночью и мне показалось, что на входе функция получает 5 чисел, а отдаёт 4 и из-за этого подумал, что нужно пропустить ошибки - тогда можно было бы использовать filter_map для пропуска ошибок.

    Изначально задача, видимо, рассчитана на то чтобы познакомить с тем что collect позволяет по разному коллектить итератор из Result
    Ответ написан
    Комментировать
  • В какую сторону решать противоречие clippy needless_return против implicit-return?

    vabka
    @vabka Куратор тега Rust
    Не противоречит.
    Implicit return по умолчанию разрешен.

    Если тебе в проекте хочется везде сделать return только явный, то тогда запрети implicit return и разреши needless return
    Ответ написан
    Комментировать
  • Под какую версию стоит писать библиотеки?

    vabka
    @vabka Куратор тега Rust
    Кажется, наиболее логичная схема для нового проекта - это взять минимальную версию, с которой твой код компилируется, ибо врядли люди, которые сидят на сильно старой версии решат добавить себе новую зависимость ;)

    Где находиться идеальный компромисс (текущая версия, текущая версия - 1, текущая версия - 5 и так далее)?

    Кажется, тут стоит самому принять решения, ориентируясь на твоих потребителей и твои собственные ресурсы. Готов ли ты сам учитывать ограничения языка N-ной давности?
    Ответ написан
    Комментировать
  • Как поправить код, чтобы улучшить расхождения времени его выполнения?

    vabka
    @vabka Куратор тега Rust
    Не скажу ничего про алгоритм и корректность замеров, но время t01 и t02 ты точно измеряешь неправильно

    subsec_nanos
    Returns the fractional part of this Duration, in nanoseconds.

    This method does not return the length of the duration when represented by nanoseconds. The returned number always represents a fractional portion of a second (i.e., it is less than one billion).
    https://doc.rust-lang.org/std/time/struct.Duration...

    У структуры Duration есть операторы для сравнения, так что тебе не обязательно знать конкретное число, пока ты не выводишь его в консоль

    let mut t01 = Duration::MIN;
    let mut t02 = Duration::MAX;
    if duration> t01 {
          t01 = duration; // здесь
       }
       if duration< t02 {
          t02 = duration; // и здесь
       }


    UPD:


    Комп 6 ядер 12 потоков ничем не нагружен. Если не накосячил с кодом, а так
    захватывается периодически ресурс потоков компа, то как такое решить
    и получать расхождение в пределах 20%?

    1. Такой разброс, как у тебя показан - это норма. Нужно смотреть не на минимум/максимум, а на распределение (в комментах скинул график - там тоже минимум и максимум сильно различаются, но прогонов с таким временем мало)
    2. Я не увидел в вопросе описания того, как происходит запуск. Хотябы в --release компилировал?
    3. У тебя данные вполне статичные, так что компилятор при желании мог очень много наоптимизировать, что даст тебе некорректные результаты, но на распределение это влиять не должно.
    Ответ написан
    5 комментариев
  • Как назвать трейты для каналов?

    vabka
    @vabka Куратор тега Rust
    А нужен ли тут трейт для канала в принципе? В какой ситуации пользователь захочет его переопределить?
    Ответ написан
  • Какие можно посмотреть курсы/уроки по практике на rust?

    vabka
    @vabka Куратор тега Rust
    Оставлю шутки, про "выучил раст" в стороне и пойду по порядку, тем более что судя по недавним вопросам - заявление крайне смелое.

    0. По хорошему стоит подтянуть математику, тк она помогает абстрактно мыслить, а без этого в разработке будет крайне тяжело. (Опять же по соседним вопросам - математика не дотягивает даже до 9 класса мбоу сош).
    В принципе на этом моменте тебе больше не нужно будет задавать подобные вопросы.

    1. Проверь, что ты действительно прочитал хотябы растбук и понял его.

    2. Определись с тем, что ты будешь делать.
    Смотри что тебе больше нравится в индустрии и тем, где тебе будет приемлимо заработать. Тут решишь, что тебе приятнее - крипта, фриланс, свой какой-то мини бизнес, или найм в какую-то крупную компанию.

    3. Найди библиотеки, фреймворки для этого. Читай документацию, смотри примеры, делай какой-нибудь личный проект для практики. Сделай до завершённого состояния.

    4. На этом шаге можно уже смело пытаться заработать в п2

    Всё очень абстрактно, тк сильно зависит от того, что ты сам хочешь.
    В принципе за пару лет вполне реально управиться.

    PS: в последнее время мне нравятся видосы decrusting ... от чела https://youtube.com/@jonhoo?si=9VbtXlH4dgdCrwQ-
    Три часа непрерывного разбора всех абстракций какой-то библиотеки
    Ответ написан
    Комментировать
  • Как узнать, что программа запущена в дебагере из кода?

    vabka
    @vabka Куратор тега Rust
    Для винды есть
    https://learn.microsoft.com/en-us/windows/win32/ap...
    и
    https://learn.microsoft.com/en-us/windows/win32/ap...

    Получить доступ к ним можно через крейт windows.
    раз https://microsoft.github.io/windows-docs-rs/doc/wi...

    два https://microsoft.github.io/windows-docs-rs/doc/wi...

    На линуксе есть файлик /proc/self/status
    https://stackoverflow.com/questions/3596781/how-to...

    На маке - хз, но тк там юникс, то можно предположить, что тоже есть /proc/self/status, но это уже не точно.

    + Ещё можно посмотреть на переменные окружения. Вполне вероятно, что дебаггеры оставляют там что-нибудь, но это направление пока не смотрел
    Ответ написан
    Комментировать
  • FnMut в немутабельной переменной?

    vabka
    @vabka Куратор тега Rust
    Потому что замыкание, которое не имеет мутабельных ссылок на окружение - автоматически реализует трейты Fn, FnMut и FnOnce.

    В функции run указан самый широкий вариант из возможных (Fn обычный был бы слишком узким, а FnOnce для run не подходит, тк замыкание предполагается вызывать много раз)

    https://habr.com/ru/articles/588917/
    https://stackoverflow.com/questions/30177395/when-...
    Ответ написан
    Комментировать
  • Как раздельно инициализировать структуру?

    vabka
    @vabka Куратор тега Rust
    Тебе ссылка через & не подойдёт тут.
    Используй Arc и Weak.
    Либо делай window тоже как ссылку на окно, которое создано в main.
    Ответ написан
    3 комментария
  • Каких вещей следует избегать в Rust?

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

    vabka
    @vabka Куратор тега Rust
    У тебя там self referential struct, так что придётся при помощи NonNull указателей сделать и запретить перемещение структуры при помощи PhantomPin.
    Лайфтайма наподобие 'self нету
    Ответ написан
    2 комментария
  • Как в библиотеке пометить макрос, как unstable?

    vabka
    @vabka Куратор тега Rust
    Мне кажется, прямо в названии отражать, что он unstable не обязательно, ибо стабилизация существует только в рамках стандартной библиотеки - просто дай ему другое название и закрой за feature, которую можно включить только на nightly.

    Когда фичу стабилизируют - добавишь в новой версии deprecated с указанием на старый макрос, а потом, в следующей мажорной версии, удалишь окончательно.
    Ответ написан
    1 комментарий
  • Как пояснить работу с типом &str?

    vabka
    @vabka Куратор тега Rust
    Для конкатенации строк нужно одно из двух:
    1. Одна из строк должна быть String, а не &str и тогда ты просто добавляешь к ней вторую
    2. Ты должнен в процессе конкатенации создавать новый String.

    А второй вариант у тебя не работает из-за того что ты дропаешь String, который был создан при конкатенации.

    Первый вариант имхо не очень читабельный получился. Лучше попробуй вот так:

    fn main() {
        let a = "x";
        println!("1. {:?}", a);   // "x"
    
        let b = format!("{}y", a);
        println!("2. {:?}", b);    // "xy"
    }


    Либо:
    fn main() {
        let mut s = "x".to_string();
        println!("1. {}", s);   // "x"
        s += "y";
        println!("2. {}", s);   // "xy"
    }
    Ответ написан
    6 комментариев
  • Как из Rust Tauri поменять $scope (angularjs)?

    vabka
    @vabka Куратор тега Rust

    П.С. Вариант из фронта по таймеру постоянно опрашивать функцию раста не предлагать.

    Хорошо, не по таймеру. Можно использовать websocket
    Ответ написан
    Комментировать
  • Как прочитать неизвестные данные из памяти по адресу?

    vabka
    @vabka Куратор тега Rust
    Скорее всего не имеет доступа твоя программа к данным, которые по этому адресу существуют.
    Ответ написан
  • Почему разные 64 битные числа считаются одинаковыми?

    vabka
    @vabka Куратор тега Rust
    в браузере на js: (2**64)-1 = 18446744073709552000

    В js используется IEEE754, а там 2^64-1 нельзя точно выразить.
    В js есть константа Number.MAX_SAFE_INTEGER, которая показывает больше какого числа лучше не ждать точности.
    Это 9007199254740991
    Ответ написан
    Комментировать