无法在Rust文档测试中使用依赖的crate

6

我正在尝试为我的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;

我在项目布局方面做错了什么?
2个回答

9

来自The Rust Programming Language,第一版 文档章节:

下面是rustdoc用于预处理示例的完整算法:

  1. 任何前导的#![foo]属性都保留为crate属性。
  2. 插入一些常见的allow属性,包括unused_variablesunused_assignmentsunused_mutunused_attributesdead_code。小例子通常会触发这些警告。
  3. 如果示例不包含extern crate,则插入extern crate <mycrate>;
  4. 最后,如果示例不包含fn main,则将其余文本包装在fn main() { your_code }中。

这里与第三点相关。当你没有任何extern crate行时,你的crate会被自动添加。一旦你添加第一个extern crate,就不会自动添加任何crate,包括你的crate在内!

你需要为regexrusty_nltk都添加extern crate行。


2
我正要把这个作为答案发布。我会采纳这个答案并添加我的解决方案作为另一个答案。 - erip

4

在查阅文档后,我用一个main包裹了我的代码以及extern crate:

/// 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);
/// }
/// ```

我决定改变我的文档风格,为所有示例包括main,但如果这不是您的风格,您可以在代码前面添加#来隐藏它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接