Получение кодируемой черты в модуле, не работающем

У меня есть 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. Почему перемещение структуры и использование директивы main.rs делает ее компиляцией?
  3. Почему изменение параметра serialize::Encodable to Show что он компилируется даже внутри модуля logging?

Однако если я добавлю

extern crate serialize;

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

к main.rs, все начинается с компиляции.

Это очень запутанно, четвертые вопросы: почему не достаточно иметь только один внешний ящик + использовать сериализацию ::.. внутри модуля регистрации?

1 ответ

Давайте посмотрим на код, который сгенерирован, с 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)] расширяется до #[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}; ,

licensed under cc by-sa 3.0 with attribution.