当前位置: 首页 > 知识库问答 >
问题:

Rust中的跨模块函数调用

端木震博
2023-03-14

我试图从另一个模块调用属于某个模块的函数(用于代码分解、组织等)。

➜  mod_test git:(master) ✗ tree
.
├── Cargo.lock
├── Cargo.toml
└── src
    ├── bin
    │   └── one.rs
    ├── lib
    │   └── two.rs
    └── main.rs

3 directories, 5 files
pub mod bin {
    pub mod one;
}
pub mod lib {
    pub mod two;
}

在这一点上,一切都好了。

没有使用crate::lib::two;使用super::lib::two;使用self::super::lib::two;bin/one.rs工作中添加的。

>

  • 编辑:我已经在Linux 5.3.0-45上安装了:RustC 1.42.0(b8cedc004 2020-03-09)

    编辑2:每当使用super关键字时,我都会从rustc中得到一个神秘的错误:

    error[E0433]: failed to resolve: there are too many leading `super` keywords
    

    我在任何地方都找不到任何故障排除方法。

    >

  • 编辑3:在src中添加lib.rs文件,声明lib模块结构,并编写使用mod_test::lib::two;one.rs中工作,但是:

    2)我必须在两个不同的地方复制完全相同的信息(main.rslib.rs)

    3)使用mod_test::lib::two;是唯一有效的语法,使用cratesuper关键字仍然会导致难以理解的编译器错误

  • 共有1个答案

    田信然
    2023-03-14

    src/bin是Cargo的特殊目录名。当您运行Cargo Build时,此目录中的文件将编译为独立的二进制文件。当编译为二进制文件时,它们不是main.rslib.rs中定义的板条箱结构的一部分。

    如果您只想使用bin::one作为main.rs中的一个模块,那么您已经使用了!将one.rs编译为独立二进制文件,而不是将bin::one编译为模块的main.rs。如果运行cargo run--bin ,编译将成功,并在main.rs中运行程序。

    为了告诉Cargo不要自己编译one.rs,我建议重命名bin目录。这不仅解决了技术问题,而且不太可能混淆其他正在阅读项目的程序员,他们希望bin包含二进制文件。可能有某种方法可以防止货物以这种方式特别对待bin;然而,重命名它可能是最好的选择。

    // lib.rs
    pub mod lib { /* note: this lib is not related to lib.rs; just unfortunately named */
        pub mod two;
    }
    

    然后在one.rs中编写use ::lib::two;

    // bin/one.rs
    use mod_test::lib::two;
    

    crate::lib::two不起作用,因为bin目录中的文件被编译为独立的二进制文件,而不是crate成员;因此,您必须使用板条箱的“外部”名称来调用它。

    在src中添加一个lib.rs文件,声明lib模块结构,并使用mod_test::lib::Two编写;在One.rs工作中,但是:

    main.rslib.rs是两个不同的板条箱根。它们可以有不同的结构。除非同时生成二进制文件和库,否则两者都不需要。如果您想从任何二进制文件(包括main.rs)中使用库板条箱,只需use:

    use mod_test;
    
    • 当存在main.rs和lib.rs时,会出现Rust模块混淆
    • 带有库和二进制文件的Rust包?
     类似资料:
    • 下文提到的ffi皆指cffi。 Rust作为一门系统级语言,自带对ffi调用的支持。 Getting Start 引入libc库 由于cffi的数据类型与rust不完全相同,我们需要引入libc库来表达对应ffi函数中的类型。 在Cargo.toml中添加以下行: [dependencies] libc = "0.2.9" 在你的rs文件中引入库: extern crate libc 在以前lib

    • 问题内容: 在Python程序中,给定带有函数名称的字符串的最佳方法是什么。例如,假设我有一个模块,我有一个内容为的字符串。最好的通话方式是什么? 我需要获取函数的返回值,这就是为什么我不只是使用。我想出了如何通过使用eval定义一个返回该函数调用结果的函数来执行此操作的方法,但是我希望有一种更优雅的方法来执行此操作。 问题答案: 假设模块与方法: 你可以将第2行和第3行缩短为: 如果这对你的用例

    • 你可以使用内建的dir函数来列出模块定义的标识符。标识符有函数、类和变量。 当你为dir()提供一个模块名的时候,它返回模块定义的名称列表。如果不提供参数,它返回当前模块中定义的名称列表。 使用dir函数 例8.4 使用dir函数 $ python >>> import sys >>> dir(sys) # get list of attributes for sys module ['__dis

    • 本节我们要讨论下模块和函数。 一个函数是一块用来执行单个操作的代码块。 一个模块则是一个Python文件,里面包含了变量,函数和其他东西。 我们启动Python REPL然后导入math模块,这个模块提供了一些数学方面的函数: >>> import math >>> math.cos(0.0) 1.0 >>> math.radians(275) 4.799655442984406 函数是包含了一

    • 问题内容: 在我的angularJS应用程序中,我有两个模块:模块A和模块B。 如何在模块B中调用该函数? 问题答案: 您需要在 模块A中 定义一个工厂: 然后使用 模块B中* 的工厂: *

    • 问题内容: 我正在为node.js代码编写一些单元测试,并且使用Sinon通过以下方式存根函数调用 该是这样的 对于诸如这样的用例,模拟显然可以工作,但是我想知道如何在使用时在anotherF()内部模拟myFunction()调用? 问题答案: 您可以稍微重构一下模块。像这样。