我在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)]
三个问题:
serialize::Encodable
更改为Show
特征会使其在logging
模块内进行编译?然而 如果我添加
extern crate serialize;
use self::serialize::{json, Encoder, Encodable};
到main.rs
,一切都开始编译。
这非常令人困惑,第四个问题是为什么只有一个extern crate +在记录模块中使用serialize :: ..是不够的?
答案 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}}。