2015-07-27 19 views
8

Sto tentando di aggiungere test di documentazione a una macro di Rust che sto esportando. Qualcosa di simile a questo:Errore "impossibile trovare la macro" nel test doc della macro

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

Se corro cargo test su questo, ottengo

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); 
    |   ^^^^^^ 

non riesco a pensare a un modo legale di aggiungere macro_use all'interno del test doc, quindi senza fortuna lì.

Lo macros in Rust's standard library segue lo stesso formato del codice sopra, quindi mi aspettavo che funzionasse.

risposta

10

I test del documento racchiudono automaticamente il blocco di codice in extern crate foo; fn main() { … } se non trovano questi elementi nel codice, ma per ottenere una macro esportata è necessario l'attributo #[macro_use] su extern crate foo;.

Pertanto, si dovrebbe scrivere questo:

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

(Le linee con prefisso vengono nascosti in uscita, ma inclusi, sans il marcatore, nel codice che viene compilato per il test doc.)

Questo è coperto in The Rust Programming Language, first edition.

Per quanto riguarda std, esiste un #[macro_use] extern crate std; implicito in tutte le casse che non hanno l'attributo di cassa #![no_std], quindi le sue macro funzionano immediatamente.

+0

Funziona perfettamente. Grazie! –

1

la ruggine linguaggio di programmazione mostra how to write doc tests for macros:

Avrete notato tre cose: abbiamo bisogno di aggiungere la nostra propria linea extern crate, in modo da poter aggiungere l'attributo #[macro_use]. Secondo, dovremo aggiungere anche il nostro main(). Infine, un uso giudizioso di # per commentare queste due cose, in modo che non vengano visualizzate nell'output.

Sto indovinando un po ', ma la ragione per cui la libreria standard della ruggine non ha bisogno di avere questo è perché tutte le macro nella libreria standard sono importati automaticamente, quindi non c'è alcun motivo per esplicitamente use loro .

Problemi correlati