在模块中导出Encodable特征不起作用

时间:2014-08-03 06:40:10

标签: rust

我在main.rs文件中有一个logging文件和一个logging.rs模块。我的文件布局是:

.
├── Cargo.toml
├── src
│   ├── logging.rs
│   └── main.rs

我的main.rs

的内容
mod logging;
fn main(){}

logging.rs

的内容
extern crate serialize;

use self::serialize::{json, Encoder, Encodable};

#[deriving(Encodable)]
pub struct Person {
  pub age: i32
}

但是这不能编译。错误是:

error: failed to resolve. Did you mean `self::serialize`?
/Users/valentin/../src/logging.rs:7 #[deriving(Encodable)]

三个问题:

  1. 为什么不编译?
  2. 为什么将struct和use指令移动到main.rs会使它编译?
  3. 为什么将serialize::Encodable更改为Show特征会使其在logging模块内进行编译?
  4. 然而 如果我添加

    extern crate serialize;
    
    use self::serialize::{json, Encoder, Encodable};
    

    main.rs,一切都开始编译。

    这非常令人困惑,第四个问题是为什么只有一个extern crate +在记录模块中使用serialize :: ..是不够的?

1 个答案:

答案 0 :(得分:3)

让我们看看使用rustc main.rs --pretty expanded

生成的代码
#![feature(phase)]
#![no_std]
#![feature(globs)]
#[phase(plugin, link)]
extern crate std = "std";
extern crate rt = "native";
use std::prelude::*;
mod logging {
    extern crate serialize;
    use std::prelude::*;

    use self::serialize::{json, Encoder, Encodable};

    pub struct Person {
        pub age: i32,
    }
    #[automatically_derived]
    impl <__S: ::serialize::Encoder<__E>, __E>
         ::serialize::Encodable<__S, __E> for Person {
        fn encode(&self, __arg_0: &mut __S) ->
         ::std::result::Result<(), __E> {
            match *self {
                Person { age: ref __self_0_0 } =>
                __arg_0.emit_struct("Person", 1u, |_e| {
                                    return _e.emit_struct_field("age", 0u,
                                                                |_e|
                                                                    (*__self_0_0).encode(_e));
                                }),
            }
        }
    }
}

fn main() { }

这表明#[deriving(Encodable)]扩展为涉及路径::serialize::*的内容;也就是说,来自包根的项目serialize

现在,extern crate serialize;内的mod logging表示serialize的路径为::logging::serialize,该模块内的self::serialize也可以访问::serialize。没有extern crate serialize;

解决方案是将extern crate移动到包根。 (这是所有use self::serialize::{json, Encoder, Encodable};定义所在的位置。)这是为您修复的,而不是{{1}}。