序列化元组类型 - 模块核心::元组是私有的

时间:2016-08-06 09:36:21

标签: serialization rust

我将使用此代码将Rust元组序列化为BERT格式:

extern crate core;

pub struct Serializer;

pub trait Serialize<T> {
    fn to_bert(&self, data: T) -> Vec<u8>;
}

impl Serialize<core::tuple> for Serializer {
    fn to_bert(&self, data: core::tuple) -> Vec<u8> {
        // some implementation
    }
}

Rust文档说这种类型在core::rust模块中定义,但是当我尝试将此类型用作特征中的参数时,编译器会生成错误:

error: type name `core::tuple` is undefined or not in scope [E0412]
impl Serialize<core::tuple> for Serializer {
               ^~~~~~~~~~~
help: run `rustc --explain E0412` to see a detailed explanation
help: no candidates by the name of `tuple` found in your project; maybe you misspelled the name or forgot to import an external crate?

error: module `tuple` is private
impl Serialize<core::tuple> for Serializer {

如果此模块是私有的,那么如何获取已定义的默认Rust tuple类型并将其用作特征的参数?

1 个答案:

答案 0 :(得分:2)

我不知道你最初是怎么得到这个名字的core::tuple,但它肯定不会帮助你。正如编译器告诉你的那样,它是私有的;你不能使用它。我甚至不认为core::rust 存在,所以我不确定你的意思。

您没有解释为什么使用libcore,也许您的目标是某些没有内存分配器或操作系统的环境。如果情况并非如此,您可能不希望直接使用libcore

除此之外,core::tuple模块,而不是类型。你不能在那个位置使用它。例如:

fn foo(a: std::mem) {}
error: type name `std::mem` is undefined or not in scope [--explain E0412]
 --> src/main.rs:1:11
1 |> fn foo(a: std::mem) {}
  |>           ^^^^^^^^ undefined or not in scope
help: no candidates by the name of `mem` found in your project; maybe you misspelled the name or forgot to import an external crate?
  

如何获取已定义的默认Rust元组类型并将其用作特征的参数

这对我来说并不完全有意义。如果您只想要具有默认值的内容,则接受泛型类型T where T: Default。当所有组件类型都实现Default时,元组实现Default

如果您不是指实际的默认值,那么您可以创建一个意味着您想要的新特征并遵循相同的模式。

要为许多大小的元组实现该特性,您可能会使用宏,就像标准库一样。没有办法表达“任意长度的所有元组”类型,因此宏用于实现特征数量(通常为32)的特征。

我认为其他人在您之前提出的问题中已经提到了这一点,但您应该真的考虑尝试为serde编写BERT适配器。这将使您能够专注于新的和有趣的方面,并重用现有的测试代码。如果不出意外,你应该阅读如何实施serde和rustc-serialize以了解其他人是如何解决同样的问题的。