我试图从Maud重新导出html宏,但每当我try 使用重新导出的宏时,都会得到一个"未解析的extern crate".

如何从我自己的 crate 重新导出这个宏?

设置

我用的是货运工作区我正在从crate a重新导出宏,并试图在crate b中使用它.

代码

我忽略了我认为无关紧要的几行.如果有细节缺失请 comments ,我会添加它们.

Workspace

# Cargo.toml

[workspace]

members = ["a", "b"]
resolver = "2"

[workspace.dependencies]
a = { path = "a" }
maud = "0.26.0"

Crate a

# a/Cargo.toml

[package]
name = "a"

[dependencies]
maud.workspace = true
// a/src/lib.rs

pub use maud::html;

Crate b

# b/Cargo.toml

[package]
name = "b"

[dependencies]
a.workspace = true
// b/src/lib.rs

use a::html;

fn test() {
    let markup = html!{ "hello" };
              // ^^^^^^^^^^^^^^^^
              // unresolved extern crate
              // can't find crate for `maud`
}

推荐答案

maud::html宏只是在其令牌输出中发出::maud,所以除了要求用户也导入maud之外,你什么也做不了,除非你想编写自己的包装器来接受一个定制的crate名称.

这个问题在decl宏中使用$crate得到了更好的解决,所以如果你可以修改maud proc宏代码,你可能需要添加一个decl宏,像这样:

// maud/src/lib.rs
macro_rules! html {
    ($($tt:tt)*) => { $crate::maud_macros::html! {
        {$crate}
        $($tt)*
    }
}

并修改proc宏代码以读取前导{$crate}令牌树.

但是,如果不要求用户在所有 crate 中导入maud个,你就无法真正解决这个问题.

Rust相关问答推荐

Rust,polars CSV:有没有一种方法可以从impll BufRead(或任何字节迭代器)中读取CSV?

为什么是!为Rust中的RwLockReadGuard和RwLockWriteGuard实现的发送特征?

为什么拥有的trait对象的相等运算符移动了正确的操作数?

什么是Rust惯用的方式来使特征向量具有单个向量项的别名?

rust 蚀生命周期 行为

使用关联类型重写时特征的实现冲突

Rust移动/复制涉及实际复制时进行检测

为什么 tokio 在以奇怪的方式调用时只运行 n 个任务中的 n-1 个?

在 Rust 中,在需要引用 self 的 struct 体方法中使用闭包作为 while 循环条件

如何在 Rust 中编写一个通用方法,它可以接受任何可以转换为另一个值的值?

如何使用tracing-subscriberRust crate 构建多编写者、全局过滤订阅者

相当于 Rust 中 C++ 的 std::istringstream

通过mem::transmute将数组展平安全吗?

为什么Rust中无法推断生命周期?

pyO3 和 Panics

从现有系列和 map 值创建新系列

改变不实现克隆的 dioxus UseState struct

TinyVec 如何与 Vec 大小相同?

令人困惑的错误消息? (解包运算符)

为移动和借位的所有组合实现 Add、Sub、Mul、Div