База Hintsage

Программирование Rust

Язык Rust и безопасное системное программирование.

Темы раздела

Выберите подраздел

Практика

Вопросы: Программирование Rust

В коде поток получает собственное владение Rc<Mutex<i32>>, но компилятор всё равно отклоняет запуск. Объясните, какой механизм делает такую передачу недопустимой.

use std::{rc::Rc, sync::Mutex, thread};

fn main() {
    let counter = Rc::new(Mutex::new(0));
    let worker_counter = Rc::clone(&counter);

    thread::spawn(move || {
        *worker_counter.lock().unwrap() += 1;
    }).join().unwrap();
}
Программирование RustКонкурентность и asyncРазработчик Rust, занимающийся многопоточными сервисами

После запуска потока компилятор отклоняет этот код. Какое ограничение времени жизни нарушено захваченным значением?

use std::thread;

fn main() {
    let message = String::from("готово");
    let handle = thread::spawn(|| {
        println!("{message}");
    });
    handle.join().unwrap();
}
Программирование RustКонкурентность и asyncRust-разработчик системного программного обеспечения

В коде ниже компилятор отвергает создание Pin<&mut F>. Какое свойство async-future делает закрепление в памяти необходимым перед передачей future исполнителю?

use std::future::Future;
use std::pin::Pin;

async fn task() {
    let text = String::from("data");
    async {}.await;
    println!("{text}");
}

fn pollable<F: Future>(mut future: F) {
    let pinned = Pin::new(&mut future);
    let _ = pinned;
}

fn main() {
    pollable(task());
}
Программирование RustКонкурентность и asyncРазработчик Rust, занимающийся асинхронными сервисами

В API объект должен поддерживать оба независимых трейта. Разберите, допустим ли такой trait object и как выразить эту границу корректно:

trait Readable {
    fn read(&self) -> String;
}

trait Writable {
    fn write(&mut self, data: &str);
}

fn process(value: &mut (dyn Readable + Writable)) {
    value.write("data");
    println!("{}", value.read());
}

Показано 141160 из 348