Rust 警告从未使用过的函数,但该函数已被使用

Bar*_*ide 1 rust rust-cargo

这是我的src文件夹结构

src/
|-- main.rs
|-- problems
|   |-- mod.rs
|   |-- p1.rs
|   `-- p2.rs
`-- utilities.rs
Run Code Online (Sandbox Code Playgroud)

我的文件包含我在和utilities.rs中使用的 2 个函数。在 和 中都是行p1.rsp2.rsp1.rsp2.rs

#[path = "../utilities.rs"]
mod utilities;
Run Code Online (Sandbox Code Playgroud)

据我了解,允许我使用中定​​义的函数 中utilities.rs 定义的两个函数utilities.rs是

pub fn get_lines(num: &str) -> Vec<String> {...}
pub fn split(s: &String, separator: &str) -> Vec<String> {...}
Run Code Online (Sandbox Code Playgroud)

在p2.rs我同时使用它们,但在p1.rs我只使用get_lines. split当我运行或构建时,这会导致货物警告我“从未使用过”的功能,它是。但该函数已被使用,而且不仅在从未调用的函数中,所以我不明白为什么货物会警告我。看来我必须在包含自制模块的每个文件中使用每个模块函数,因为如果我确实调用,split则p1.rs警告就会消失。我不明白什么?

更清楚地说,问题是当我cargo run得到以下内容时

warning: function is never used: `split`
  --> src/problems/../utilities.rs:23:8
   |
23 | pub fn split(s: &String, separator: &str) -> Vec<String> {
   |        ^^^^^
   |
   = note: `#[warn(dead_code)]` on by default
Run Code Online (Sandbox Code Playgroud)

Kev*_*eid 5

在普通情况下,您通常不应该使用该属性,因为它会让您犯这个错误。#[path]

\n

理解 Rust 模块的关键是mod 定义模块及其内容。每个mod项目都是一个与其他项目不同的模块。因此,如果您mod以引用同一个文件的方式写入两次,则该文件将被编译两次,从而生成该文件中定义的内容的两个副本。这就是为什么您收到dead_code警告 \xe2\x80\x94\xc2\xa0you\'ve 定义了两个不同的函数problems::p1::utilities::split()和problems::p2::utilities::split(),并且其中之一未使用。

\n

作为一般规则,在结构简单的项目中,项目中的任何模块源文件都应该只有一项mod。在这种情况下,找到该mod项目的自然位置是main.rs,它应该是:

\n
mod utilities;\n
Run Code Online (Sandbox Code Playgroud)\n

p1.rs然后,您可以在您的或中引用此模块p2.rs:

\n
use crate::utilities;\n
Run Code Online (Sandbox Code Playgroud)\n

另一方面,也许它们仅utilities与模块更相关problems。在这种情况下,你会

\n
    \n
  • 将文件放置在src/problems/utilities.rs,
  • \n
  • 写入,mod utilities;和src/problems/mod.rs
  • \n
  • p1将和中的实用程序称为p2(use super::utilities;相对路径)或use crate::problems::utilities;(绝对路径)。
  • \n
\n

一般来说,引入新模块的过程是:

\n
    \n
  • 选择一个模块作为您的模块的父模块。(不要考虑目录和文件,而是考虑模块。)
  • \n
  • 写入mod my_module_name;该父模块。
  • \n
  • 鉴于此,将文件放在需要的位置。(如果您此时尝试编译程序,编译器会告诉您缺少哪个文件;或者如果您rust-analyzer在 IDE 中使用,您可以要求它创建该文件。)
  • \n
  • 无论您想要在何处使用该模块,请根据其所在位置通过适当的绝对或相对路径引用它mod;use如果您想为其路径创建一个方便的短别名,请使用。
  • \n
\n