Невозможно использовать зависимый ящик в тестах документации Rust

Я пытаюсь написать документацию для проекта, который пишу на Rust. Один из документов требует использования regex::Regex. Вот документ, который я пытаюсь написать:

/// Return a list of the offsets of the tokens in `s`, as a sequence of `(start, end)`
/// tuples, by splitting the string at each successive match of `regex`.
///
/// # Examples
///
/// ```
/// use rusty_nltk::tokenize::util::regexp_span_tokenize;
/// use regex::Regex;
///
/// let s = "Good muffins cost $3.88\nin New York.  Please buy me
///         two of them.\n\nThanks.";
/// let regex = regex::Regex::new(r"\s").unwrap();
/// let spans = regexp_span_tokenize(s, regex).unwrap();
/// ```

Это дает мне эту ошибку:

---- tokenize::util::regexp_span_tokenize_0 stdout ----
    <anon>:4:9: 4:14 error: unresolved import `regex::Regex`. Maybe a missing `extern crate regex`? [E0432]
<anon>:4     use regex::Regex;
                 ^~~~~
error: aborting due to previous error

Но когда я добавляю extern crate regex;, я получаю такую ​​ошибку:

---- tokenize::util::regexp_span_tokenize_0 stdout ----
    <anon>:3:9: 3:19 error: unresolved import `rusty_nltk::tokenize::util::regexp_span_tokenize`. Maybe a missing `extern crate rusty_nltk`? [E0432]
<anon>:3     use rusty_nltk::tokenize::util::regexp_span_tokenize;
                 ^~~~~~~~~~
<anon>:4:9: 4:14 error: unresolved import `regex::Regex`. Did you mean `self::regex`? [E0432]
<anon>:4     use regex::Regex;
                 ^~~~~
error: aborting due to 2 previous errors

Некоторые важные части соответствующих файлов:

src / lib.rs:

extern crate regex;
pub mod tokenize;

src / tokenize / mod.rs:

extern crate regex;
pub mod util;

(Вверху) src / tokenize / util.rs:

extern crate regex; 
use regex::Regex;

Что я делаю не так с макетом моего проекта?


person erip    schedule 19.12.2015    source источник


Ответы (2)


Из Язык программирования Rust, первое издание главы по документация:

Вот полный алгоритм, который использует rustdoc для предварительной обработки примеров:

  1. Любые ведущие атрибуты #![foo] остаются неизменными как атрибуты ящика.
  2. Вставляются некоторые общие разрешающие атрибуты, включая unused_variables, unused_assignments, unused_mut, unused_attributes и dead_code. Небольшие примеры часто вызывают эти линты.
  3. Если пример не содержит extern crate, то вставляется extern crate <mycrate>;.
  4. Наконец, если пример не содержит fn main, остальная часть текста будет заключена в fn main() { your_code }.

Здесь актуален пункт №3. Если у вас нет extern crate строк, ваш ящик добавляется автоматически. Как только вы добавите первый extern crate, без ящиков не будет автоматически добавляться, в том числе и ваш ящик!

Вам нужно будет добавить extern crate строк как для regex, так и для rusty_nltk.

person Shepmaster    schedule 19.12.2015
comment
Я как раз собирался опубликовать это в качестве ответа. Я дам на это ответ и добавлю свое решение как отдельный ответ. - person erip; 19.12.2015

После того, как меня указали на документы, я решил это, заключив main в свой код с помощью extern crates:

/// Return a list of the offsets of the tokens in `s`, as a sequence of `(start, end)`
/// tuples, by splitting the string at each successive match of `regex`.
///
/// # Examples
///
/// To return a list of spans based on whitespaces:
///
/// ```
/// extern crate regex;
/// extern crate rusty_nltk;
/// use rusty_nltk::tokenize::util::regexp_span_tokenize;
/// use regex::Regex;
///
/// fn main() {
///   let s = "Good muffins cost $3.88\nin New York.  Please buy me
///           two of them.\n\nThanks.";
///   let regex = Regex::new(r"\s").unwrap();
///   let spans = regexp_span_tokenize(s, &regex);
/// }
/// ```

Я решил изменить свой стиль документа, чтобы включить mains для всех примеров, но если это не ваш стиль, вы можете добавить # перед кодом, чтобы скрыть его от документов.

person erip    schedule 19.12.2015