gpt4 book ai didi

rust - 在模块中派生 Encodable 特性不起作用

转载 作者:行者123 更新时间:2023-11-29 08:06:57 25 4
gpt4 key购买 nike

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

.
├── 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 模块中也能编译?

但是如果我添加

extern crate serialize;

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

main.rs,全部开始编译。

这很令人困惑,第四个问题是为什么只有一个 extern crate + use serialize::.. inside logging 模块还不够?

最佳答案

让我们看看生成的代码,使用 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 来自 crate root

现在,extern crate serialize; 来自 mod logging 意味着 serialize 的路径是 ::logging::serialize ,也可以在模块内作为 self::serialize 访问;没有 ::serialize

解决方案是将 extern crate serialize; 移动到 crate root 中。 (这是所有 extern crate 定义的地方。)这是为您修复的,而不是 use self::serialize::{json, Encoder, Encodable};.

关于rust - 在模块中派生 Encodable 特性不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25102321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com