2015-07-27 15 views
8

Dışa aktardığım bir Rust makrosuna dokümantasyon testleri eklemeye çalışıyorum. Böyle bir şey: Bu konuda cargo test çalıştırırsanızMakro'nun kendi doc testinde "makro bulunamıyor" hatası

/// Usage: 
/// 
/// ``` 
/// let x = addone!(100); 
/// ``` 
#[macro_export] 
macro_rules! addone { 
    ($x:expr) => ($x + 1) 
} 

, ben

failures: 

---- src/lib.rs - addone (line 3) stdout ---- 
    error: cannot find macro `addone!` in this scope 
--> src/lib.rs:2:9 
    | 
2 | let x = addone!(100); 
    |   ^^^^^^ 

olsun ben doktor test içindeki macro_use ekleme yasal bir şekilde düşünemiyorum, orada hiçbir şanslar.

macros in Rust's standard library, yukarıdaki kodla aynı biçimi izler, dolayısıyla çalışmasını bekliyordum.

cevap

10

Doc testleri otomatik extern crate foo; üzerinde #[macro_use] niteliği ihtiyaç onlar koduna bu unsurları bulamayan extern crate foo; fn main() { … } kod bloğunu sarın, ama bir ihraç makro alır.

Böylece, bu yazmalıdır: öneki

/// Usage: 
/// 
/// ``` 
/// # #[macro_use] extern crate foo; fn main() { 
/// let x = addone!(100); 
/// # } 
/// ``` 
#[macro_export] 
macro_rules! addone { 
    ($x:expr) => ($x + 1) 
} 

(çizgiler doc test için derlenmiş kod, sans işaretleyici çıkışında gizli, ancak dahil olsun.)

Bu, The Rust Programming Language, first edition kapsamındadır.

std'a gelince, #![no_std] sandık özniteliğinden yoksun olan tüm kasalarda #[macro_use] extern crate std; belirtildiği gibi, makroları hemen çalışır.

+0

Kusursuz çalışır. Teşekkürler! –

1

Pas Programlama Dilihow to write doc tests for macros gösterir: Üç şeye dikkat edeceğiz

: biz #[macro_use] özelliğini ekleyebilirsiniz, böylece kendi extern crate satır eklemek gerekir. İkincisi, kendi main()'u da eklememiz gerekecek. Son olarak, bu iki şeyi yorumlamak için #'un makul bir şekilde kullanımı, bu nedenle çıktıda görünmez.

Biraz tahmin ediyorum, ancak standart kütüphanesinde makro tüm otomatik olarak alınır çünkü Pas standart kütüphane bu olması gerek olmaması nedeni, bu yüzden hiçbir neden onları use açıkça ne var ki .

İlgili konular