我将使用此代码将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
类型并将其用作特征的参数?
答案 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以了解其他人是如何解决同样的问题的。