首页 > 解决方案 > 如何将当前 crate 中定义的宏导入 doc 测试?

问题描述

我正在尝试编写一个文档测试,它使用我在我正在编写文档测试的箱子中定义的宏。我编写了这个重现问题的综合示例:

#[macro_export]
macro_rules! my_vec {
    ($($element: expr),*) => {
        crate::MyVec::from_vec(vec![$($element),*])
    }
}

pub mod my_vector {
    #[derive(Debug, Eq, PartialEq)]
    pub struct MyVec<T> {
        vec: Vec<T>
    }

    impl <T> MyVec<T> {
        pub fn from_vec(vec: Vec<T>) -> Self {
            Self { vec }
        }

        /// ```
        /// # // what can I put here to make the doc test compile?
        /// let mut v = my_vec![1,2,3];
        /// v.clear();
        /// assert_eq!(v, my_vec![]);
        /// ```
        pub fn clear(&mut self) {
            *self = my_vec![]
        }
    }
}
pub use my_vector::MyVec;

fn main() {
    let mut v = my_vec![1,2,3];
    v.clear();
    assert_eq!(v, my_vec![]);
}

锈游乐场链接

如果我运行代码,main函数会按预期正常运行,但是如果我尝试运行测试,包含相同代码的 doc 测试会导致以下错误:

---- src/lib.rs - my_vector::MyVec<T>::clear (line 19) stdout ----
error: cannot find macro `my_vec` in this scope
 --> src/lib.rs:21:13
  |
4 | let mut v = my_vec![1,2,3];
  |             ^^^^^^

error: cannot find macro `my_vec` in this scope
 --> src/lib.rs:23:15
  |
6 | assert_eq!(v, my_vec![]);
  |               ^^^^^^

如何将宏导入测试?

标签: rustmacros

解决方案


推荐阅读