UseDeclaration 在板条箱根中找不到结构
UseDeclaration cannot find struct in the crate root
我从 cargo new tst
开始。然后在 src/lib.rs
我有:
pub struct Config {}
并且 src/main.rs
如下所示:
use crate::Config;
fn main() {}
然而这并不能编译:
> cargo run
Compiling tst v0.1.0 (/home/*/rust/book/tst)
error[E0432]: unresolved import `crate::Config`
--> src/main.rs:1:5
|
1 | use crate::Config;
| ^^^^^^^^^^^^^ no `Config` in the root
For more information about this error, try `rustc --explain E0432`.
error: could not compile `tst` due to previous error
但是如果我像这样用箱子的名称替换 crate::
:
use tst::Config;
fn main() {}
然后就可以了:
> cargo run
Compiling tst v0.1.0 (/home/*/rust/book/tst)
warning: unused import: `tst::Config`
--> src/main.rs:1:5
|
1 | use tst::Config;
| ^^^^^^^^^^^
|
= note: `#[warn(unused_imports)]` on by default
warning: `tst` (bin "tst") generated 1 warning
Finished dev [unoptimized + debuginfo] target(s) in 0.25s
Running `target/debug/tst`
rustc --explain E0432
的输出有以下引用,如果我理解正确的话,我可以 使用 crate 的名称 或者简单地 crate::
:
In Rust 2018, paths in use
statements are relative to the current module
unless they begin with the name of a crate or a literal crate::
, in which
case they start from the crate root. As in Rust 2015 code, the self::
and
super::
prefixes refer to the current and parent modules respectively.
我是不是做错了什么?有没有一种方法可以使用 lib.rs
中的代码而不用硬编码 crate 的名称?
> rustc --version
rustc 1.56.1 (Arch Linux rust 1:1.56.1-3)
> cat Cargo.toml
[package]
name = "tst"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
无法引用“我的包中的库箱”;你必须通过它的名字来引用它。 Rust 编译器(目前)不知道关于碰巧在同一个 Cargo 包中的其他箱子的任何信息; 它一次只编译一个箱子。
为了改变这一点,您需要编写一个 Rust RFC,其中需要包含一个描述,说明为什么拥有此功能很有价值——可能比“它不会那么硬编码”更有说服力”,因为 main
取决于库几乎肯定会使用特定于库的名称,所以库本身的名称是一个小问题(除非,我想,你从一个公共的创建许多包模板)。
我从 cargo new tst
开始。然后在 src/lib.rs
我有:
pub struct Config {}
并且 src/main.rs
如下所示:
use crate::Config;
fn main() {}
然而这并不能编译:
> cargo run
Compiling tst v0.1.0 (/home/*/rust/book/tst)
error[E0432]: unresolved import `crate::Config`
--> src/main.rs:1:5
|
1 | use crate::Config;
| ^^^^^^^^^^^^^ no `Config` in the root
For more information about this error, try `rustc --explain E0432`.
error: could not compile `tst` due to previous error
但是如果我像这样用箱子的名称替换 crate::
:
use tst::Config;
fn main() {}
然后就可以了:
> cargo run
Compiling tst v0.1.0 (/home/*/rust/book/tst)
warning: unused import: `tst::Config`
--> src/main.rs:1:5
|
1 | use tst::Config;
| ^^^^^^^^^^^
|
= note: `#[warn(unused_imports)]` on by default
warning: `tst` (bin "tst") generated 1 warning
Finished dev [unoptimized + debuginfo] target(s) in 0.25s
Running `target/debug/tst`
rustc --explain E0432
的输出有以下引用,如果我理解正确的话,我可以 使用 crate 的名称 或者简单地 crate::
:
In Rust 2018, paths in
use
statements are relative to the current module unless they begin with the name of a crate or a literalcrate::
, in which case they start from the crate root. As in Rust 2015 code, theself::
andsuper::
prefixes refer to the current and parent modules respectively.
我是不是做错了什么?有没有一种方法可以使用 lib.rs
中的代码而不用硬编码 crate 的名称?
> rustc --version
rustc 1.56.1 (Arch Linux rust 1:1.56.1-3)
> cat Cargo.toml
[package]
name = "tst"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
无法引用“我的包中的库箱”;你必须通过它的名字来引用它。 Rust 编译器(目前)不知道关于碰巧在同一个 Cargo 包中的其他箱子的任何信息; 它一次只编译一个箱子。
为了改变这一点,您需要编写一个 Rust RFC,其中需要包含一个描述,说明为什么拥有此功能很有价值——可能比“它不会那么硬编码”更有说服力”,因为 main
取决于库几乎肯定会使用特定于库的名称,所以库本身的名称是一个小问题(除非,我想,你从一个公共的创建许多包模板)。