@TicSo

Как изменить структуру кода?

Как вынести блок кода из функции `main` в отдельный файл, например, `m03.rs` так, чтобы все переменные из этого
файла были видны далее по ходу кода в `main`. Для удобства, чтобы не сворачивать код в редакторе и иных целей ...

Если правильно понял, то через модульную структуру, где например, есть файл `main.rs` и отдельные файлы `m01.rs`, `m02.rs` и `m03.rs`, можно так:

spoiler

fn main() {
    m01::f1();
    m02::f2();
    
    /*
    [B] - блок кода, который хочу вынести в отдельный файл,
          но чтобы его переменные были видны ниже по коду
          в ф-ции main, например:
    let i: u8 = 88;
    let p: String = "xyz".to_string;
    */

    // println!("i = {:?}", i);
    // println!("p = {:?}", p);
}

pub mod m01 {
    pub fn f1() {
       let num: u8 = 12;
       println!("num = {:?}", num);
    }
}

pub mod m02 {
    pub fn f2() {
       let s: String = "abc".to_string();
       println!("s = {:?}", s);
    }
}

pub mod m03 {
    /*
    [B] - блок кода;
    */
}


Возможно ли поместить в файл `m03.rs` блок кода из `main.rs`, чтобы при сборке он перемещался обратно, а не вызывать этот блок как функцию с ограничением видимости?
  • Вопрос задан
  • 82 просмотра
Решения вопроса 1
vabka
@vabka Куратор тега Rust
Нет, нельзя. Модули в Rust оперируют функциями/типами/трейтами, но не отдельными кусками кода.
Ты можешь вынести функции f1 и f2 в отдельные файлы:

main.rs
mod m01;
mod m02;
mod m03;

fn main() {
    m01::f1();
    m02::f2();
    let (i, p) = m03::f3();
    println!("i = {:?}", i);
    println!("p = {:?}", p);
}


m01.rs
pub fn f1() {
 let num: u8 = 12;
 println!("num = {:?}", num);
}


m03.rs
pub fn f2() {
 let s: String = "abc".to_string();
 println!("s = {:?}", s);
}


В случае m03 ты можешь попробовать сделать функцию, которая будет возвращать значения переменных i и p:
pub fn f3() -> (u8, String) {
  let i: u8 = 88;
  let p: String = "xyz".to_string();
  (i, p)
}


PS: Я уже было хотел предложить макрос вида:
macro_rules! f4 {
  () => {
    let i: u8 = 88;
    let p: String = "xyz".to_string();
  }
}

Но он работать не будет, ибо гигиена.

Но можно сделать так:
macro_rules! f4 {
  ($a: ident, $b: ident) => {
    let $a: u8 = 88;
    let $b: String = "xyz".to_string();
  }
}

fn main() {
    f4!(i, p);
    println!("{} {}", i, p);
}


PPS: ну и ещё есть макрос include!, который буквально решает твою задачу - вставить кусок кода из файла, но его я не советую использовать.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы