gpt4 book ai didi

rust - 是否可以为结构的一部分派(dispatch)生(RustcEncodable)?

转载 作者:行者123 更新时间:2023-11-29 08:03:07 27 4
gpt4 key购买 nike

我有一个像这样的结构:

struct S {
data: i32,
fun: Box<Fn()>,
}

并希望使用编码器序列化数据部分。为此,我使用 rustc_serialize 并推导出它的特征,例如

#[derive(RustcEncodable, RustcDecodable)]
struct S {
data: i32,
fun: Box<Fn()>,
}

问题是 fun 不能被序列化,因为它是一个函数。这很好,因为我只想序列化普通的 data 字段。有办法吗?

我实际用例中的 data 字段也是一个结构,它也可以有一个 Fn,所以我不能简单地将结构分成两个。

最佳答案

简短的回答是“不”。 rustc-serialize crate 1 不提供对 DecodableEncodable 等特征的自动实现的控制级别。

为此,您需要自己实现它们:

extern crate rustc_serialize;

use rustc_serialize::{Encodable, Encoder};
use rustc_serialize::json;

struct S {
data: i32,
fun: Box<Fn()>,
}

impl Encodable for S {
fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> {
s.emit_struct("S", 1, |s| {
s.emit_struct_field("data", 0, |s| {
s.emit_i32(self.data)
})
})
}
}

fn main() {
let thing = S { data: 42, fun: Box::new(|| println!("I am a function")) };
let json = json::encode(&thing).expect("Couldn't encode");
println!("{}", json);
(thing.fun)();
}

如果您不熟悉 rustc-serialize,您可能会对 serde 感兴趣它提供了 #[serde(skip_serializing)]#[serde(skip_deserializing)] 注释。


1:从技术上讲,#[derive(RustcEncodable, RustcDecodable)] 由编译器提供。这就是它具有 Rustc 前缀的原因。它也是一个丑陋的疣,想要被去除,但正在等待编译器插件的稳定支持。

关于rust - 是否可以为结构的一部分派(dispatch)生(RustcEncodable)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37288282/

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