【问题标题】:could not find `schema` in `super` when import rust mod导入 rust mod 时在“super”中找不到“schema”
【发布时间】:2021-11-05 18:14:32
【问题描述】:

我正在学习rust,现在尝试导入一个struct,这是源文件路径app_root/src/model/response/playlist_response.rs,我正在导入另一个这样的struct:

#[path = "../../models.rs"]
mod models;

use models::QueryPlaylist;

model.rs 路径为app_root/src/models.rsmodels.rs 文件如下所示:

use super::schema::posts;
use super::schema::playing_record;
use super::schema::favorites;
use super::schema::songs;
use super::schema::playlist;
use super::schema::album;
use rocket::serde::Serialize;

#[derive(Insertable,Serialize,Queryable)]
#[table_name="playlist"]
pub struct QueryPlaylist {
    pub id: i64,
    pub creator: i64,
    pub name: String,
    pub cover_url: Option<String>,
    pub description: Option<String>,
    pub subscribed: Option<i32>,
    pub subscribed_count: Option<i64>,
    pub comment_count: Option<i64>,
    pub share_count: Option<i32>,
    pub play_count: Option<i32>
}

当我编译项目时,显示如下错误:

$ cargo build                                                                                                                                        ‹ruby-2.7.2›
   Compiling reddwarf_music v0.1.0 (/Users/dolphin/Documents/GitHub/reddwarf_music)
error[E0432]: unresolved import `super::schema`
 --> src/biz/music/../../model/response/../../models.rs:1:12
  |
1 | use super::schema::posts;
  |            ^^^^^^ could not find `schema` in `super`

error[E0432]: unresolved import `super::schema`
 --> src/biz/music/../../model/response/../../models.rs:2:12
  |
2 | use super::schema::playing_record;
  |            ^^^^^^ could not find `schema` in `super`

error[E0432]: unresolved import `super::schema`
 --> src/biz/music/../../model/response/../../models.rs:3:12
  |
3 | use super::schema::favorites;
  |            ^^^^^^ could not find `schema` in `super`

error[E0432]: unresolved import `super::schema`
 --> src/biz/music/../../model/response/../../models.rs:4:12
  |
4 | use super::schema::songs;
  |            ^^^^^^ could not find `schema` in `super`

error[E0432]: unresolved import `super::schema`
 --> src/biz/music/../../model/response/../../models.rs:5:12
  |
5 | use super::schema::playlist;
  |            ^^^^^^ could not find `schema` in `super`

error[E0432]: unresolved import `super::schema`
 --> src/biz/music/../../model/response/../../models.rs:6:12
  |
6 | use super::schema::album;
  |            ^^^^^^ could not find `schema` in `super`

schema.rs 文件路径是app_root/src/schema.rs。我使用错误的方式导入?这样的问题是什么?我应该怎么做才能让它工作?这是main.rs

#[macro_use]
extern crate rocket;

#[macro_use]
extern crate diesel;

// #[macro_use]
// extern crate redis;

#[path="biz/music/music.rs"] mod music;
#[path="config/db/config.rs"] mod config;
#[path="biz/music/songs.rs"] mod songs;
#[path="biz/music/test.rs"] mod test;
#[path="biz/user/user.rs"] mod user;
#[path="biz/music/playlist.rs"] mod playlist;


#[launch]
fn rocket() -> _ {
    rocket::build()
        .mount("/music/music", routes![music::play_record,music::save_play_record,music::like,music::dislike])
        .mount("/music/songs",routes![songs::detail])
        .mount("/music/user",routes![user::recent_found])
        .mount("/music/playlist",routes![playlist::user_playlist])
        .mount("/music/test", routes![test::detail])
}

【问题讨论】:

  • 您是否将src/models.rssrc/schema.rs 导入或在main.rs 中声明为mod models;mod schema;
  • 是的,我已将 models.rsschema.rs 作为 mod 导入到 main.rs。 @kmdreko
  • 我已经粘贴了我的main.rs@kmdreko

标签: rust


【解决方案1】:

您不应使用#[path = ...] 尝试导入models.rs。它将声明一个新模块,而不是像main.rs 中声明的那样使用它。这反过来又弄乱了 it 导入内容的方式,因为 super 并不意味着同样的事情。

相反,您应该使用以下方法简单地导入它:

use crate::models;

另见:

【讨论】:

  • 我在使用直接使用 import mod.@kmdreko 时在根目录中得到错误 no models
  • 请在您的帖子中包含main.rs
【解决方案2】:

通常这是您在项目中处理不同文件的方式: 假设你有这个结构:

.
├── app
│   ├── some_logic.rs
├── database
│   ├── models.rs
├── config.rs
└── main.rs

您在main.rs 中声明:

mod config;
mod database{
    pub mod models;
}
mod app {
    pub mod some_logic;
}

然后您可以使用models.rs 的任何公共成员:database::models::SomeStructsome_logic.rs 也是如此,您可以使用 app::some_logic::SomeStruct 访问其成员。当然config.rs 的成员可以通过config::SomeStruct 访问。

假设您想从models.rs 访问带有main.rs 的常量MY_CONSTANT

fn function_within_models_rs() {
    println!("Constant: {}", crate::MY_CONSTANT)
}

并从models.rs 中访问some_logic.rs 中声明的pub const LOGIC_CONSTANT: i32 = 222;

fn function_within_models_rs() {
    println!("Constant: {}", crate::app::some_logic::LOGIC_CONSTANT)
}

如您所见,从模块外部访问的元素在其中声明,需要声明为pub(公共)。编译器可以很好地提示您需要将哪些内容设置为公开,因此我建议您将其保密,直到您真的想在其他地方使用它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 2021-06-29
    • 2018-03-04
    • 1970-01-01
    相关资源
    最近更新 更多