Разные типы ржавчины при обращении к одному и тому же файлу - PullRequest
0 голосов
/ 30 мая 2020

Я столкнулся с проблемой при попытке использовать настраиваемое перечисление для нескольких файлов в Rust. Я ожидал, что смогу написать один файл, содержащий это перечисление, и ссылаться на него из нескольких файлов (file_a.rs запускает функцию, которая возвращает перечисление Shape, main.rs соответствует типу, но ожидает types :: Shape и находит file_a :: types :: Shape). В результате я ожидаю, что оба имеют тип types :: Shape, но, похоже, это не так.

В прошлом, чтобы исправить эту проблему, я просто помещал весь код, который создает эти конфликты в один и тот же файл. Это не кажется подходящим решением, и особенно не профессиональным. меня к ним, если можете).

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

Вот небольшой пример, демонстрирующий проблему. Ошибки возникают в main.rs в операторе match.

Структура каталогов:

src
|    main.rs
|____core
|   |    types.rs
|   |    file_a.rs

/ src / main.rs:

#[path = "./core/types.rs"]
mod types;
use types::*;

#[path = "./core/file_a.rs"]
mod file_a;
use file_a::*;

fn main()
{
    match return_a_shape()
    {
        Shape::CIRCLE => println!("circle"),        // expected enum `file_a::types::Shape`, found enum `types::Shape`
        Shape::SQUARE => println!("square"),        // expected enum `file_a::types::Shape`, found enum `types::Shape`
        Shape::TRIANGLE => println!("triangle"),    // expected enum `file_a::types::Shape`, found enum `types::Shape`
        _ => println!("unknown shape"),
    }
}

/ src / core /file_a.rs:

mod types;
use types::*;

pub fn return_a_shape() -> Shape
{
    return Shape::CIRCLE;
}

/ src / types.rs:

pub enum Shape
{
    SQUARE,
    CIRCLE,
    TRIANGLE,
}

1 Ответ

2 голосов
/ 30 мая 2020

Просто изучаю ржавчину, но насколько я понимаю, проблема здесь не в enum, а в mod. Это ключевое слово превращает один модуль в подмодуль другого модуля. Итак, когда вы превращаете types в подмодуль как file_a, так и main, он импортируется дважды как два разных модуля.

Вы можете удалить строку mod types; из file_a.rs и импортировать это из родительского модуля как use super::types::*;.

use super::types::*;

pub fn return_a_shape() -> Shape
{
    return Shape::CIRCLE;
}

Или вы можете импортировать модуль types в file_a, но не в модуль main, и повторно экспортировать его:

file_a.rs

pub mod types; // Import types as a submodule and reexport it
use types::*;

pub fn return_a_shape() -> Shape
{
    return Shape::CIRCLE;
}

main.rs

#[path = "./core/file_a.rs"]
mod file_a;
use file_a::*;
use file_a::types::*; // Use types submodule from the file_a module

fn main()
{
    match return_a_shape()
    {
        Shape::CIRCLE => println!("circle"),
        Shape::SQUARE => println!("square"),
        Shape::TRIANGLE => println!("triangle"),
        _ => println!("unknown shape"),
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...