Module 如何访问main.rs中已写入同一软件包中不同目录的文件中的函数

Module 如何访问main.rs中已写入同一软件包中不同目录的文件中的函数,module,rust,rust-cargo,rust-crates,Module,Rust,Rust Cargo,Rust Crates,我想调用main.rs文件中的函数。我在与main.rs相同的src文件夹中创建了一个目录名“library” src/main.rs mod library; fn main() { println!("{}", library::name1::name(4)); } src/library/file.rs pub mod name1 { pub fn name(a: i32) -> i32 { println!("from diff file {}",

我想调用main.rs文件中的函数。我在与main.rs相同的src文件夹中创建了一个目录名“library”

src/main.rs

mod library;

fn main() {
   println!("{}", library::name1::name(4));
}
src/library/file.rs

pub mod name1 {
    pub fn name(a: i32) -> i32 {
        println!("from diff file {}", a);
        a * a
    }
}
在main.rs中调用此函数名时,编译器抛出一个错误:

错误[E0583]:找不到模块库的文件


我想我错过了什么。正确的方法是什么?请记住,library目录只是一个普通目录,而不是一个货物包

在src目录中创建一个名为library.rs的文件,然后在library.rs中编写以下代码:

pub mod file;
然后从主文件中访问与当前相同的函数。这样它将正常工作

你也可以遵循这个方法


您可以使用rust所拥有的库的概念。 只需创建一个具有--lib标志的库项目

cargo build library --lib
做完之后。您将在Cargo.toml中的依赖项部分编写此代码

您甚至可以使用目录的绝对路径

library = {path = "C:/Users/Admin/Desktop/Rust/jawwad/src/library"}  
然后在lib.rs文件中编写库代码

pub mod name1 {
    pub fn name(a: i32) -> i32 {
          println!("from diff file {}", a);
          a * a
    }
}
这是main.rs文件

use library;

fn main() {
   println!("{}", library::name1::name(4));
}

您可以通过两种不同的方式解决此问题:

1)使用模块 2)使用图书馆

使用模块

只需在src目录的main.rs旁边创建一个文件,并将其命名为name1.rs

name1.rs将类似于:

//no need to specify "pub mod name1;" explicitly
pub fn name(a: i32) -> i32 {
   println!("from diff file {}", a);
   a * a
}
//name of the second file will be treated as module here
pub mod name1;

fn main() {
   println!("{}", name1::name(4));
}
pub fn name(a: i32) -> i32 {
             println!("from diff file {}", a);
             a * a
}
main.rs将类似于:

//no need to specify "pub mod name1;" explicitly
pub fn name(a: i32) -> i32 {
   println!("from diff file {}", a);
   a * a
}
//name of the second file will be treated as module here
pub mod name1;

fn main() {
   println!("{}", name1::name(4));
}
pub fn name(a: i32) -> i32 {
             println!("from diff file {}", a);
             a * a
}
使用库

a) 在主项目目录(即src目录的父目录)中创建一个库,并运行以下命令:

//In your case library name "file"     
$ cargo new --lib file
此命令将创建与主项目相同的名称文件的另一个目录

b) 在主项目的Cargo.toml文件的依赖项部分添加此库(文件)

[package]
name = "test_project"
version = "0.1.0"
authors = ["mohammadrajabraza <mohammadrajabraza@gmail.com>"]
edition = "2018"


# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
file = {path ="file"}
d) 最后,您的主要.rs将是:

//importing library in thescope
use file;

fn main() {
   println!("{}", file::name(4));
}

这并不能解决问题。该错误与我将文件名更改为library.rsa的错误相同。如果要删除您在src目录中创建的“library”目录,请不要从其他文件中删除它,而是从同一src目录中的其他目录调用该函数!您的问题不是调用函数。您发布的错误消息是关于您的
mod库的语句。Rust编译器应该在错误消息下面显示该行。简而言之,问题的解决方案是:将
library/file.rs
重命名为
library/mod.rs
。您还应该删除
pub mod name1
,因为通常不使用内联
mod
定义。我希望这有帮助。但我建议你通读相关问题的答案。