Rust 枚举和结构上的可编码特征边界有问题

Rust 枚举和结构上的可编码特征边界有问题,rust,Rust,带着锈去试驾。到目前为止还很有趣,但我不确定如何在这个例子中设置特质边界来做一些有用的事情 未能找到trait的实现 serialize::serialize::Encodable,std::io::IoError> 对于T 在我看来,我需要在枚举列表上设置一个绑定。但是,当我尝试这个时,编译器会有点不高兴 错误:枚举中不允许特征边界 定义 所以我假设我必须对实现impl设置边界,但是得到了这个 错误:类型参数的数量错误:应为2,但 找到0 如果是这样的话,我怎么能在生锈的地方做这样的事情呢 e

带着锈去试驾。到目前为止还很有趣,但我不确定如何在这个例子中设置特质边界来做一些有用的事情

未能找到trait的实现 serialize::serialize::Encodable,std::io::IoError> 对于T

在我看来,我需要在枚举
列表上设置一个绑定。但是,当我尝试这个时,编译器会有点不高兴

错误:枚举中不允许特征边界 定义

所以我假设我必须对实现
impl
设置边界,但是得到了这个

错误:类型参数的数量错误:应为2,但 找到0

如果是这样的话,我怎么能在生锈的地方做这样的事情呢

extern crate serialize;
use serialize::{ json, Encodable };

#[deriving(Decodable, Encodable)] 
pub enum List<T> {
    Node(T, Box<List<T>>),
    Nil
}

impl<T> List<T> {
fn to_json(&self) -> String {
    json::Encoder::str_encode(self)
}
}
extern板条箱序列化;
使用serialize::{json,Encodable};
#[推导(可解码,可编码)]
发布枚举列表{
节点(T,盒),
无
}
impl列表{
fn to_json(&self)->字符串{
json::Encoder::str_encode(self)
}
}
当我工作时,似乎工作正常。不要试图封装编码,因为它知道int是可编码的

let mut list: List<int> = Nil;
...
let encoded_string = json::Encoder::str_encode(&list);
println!("{}", encoded_string);
let mut list:list=Nil;
...
让encoded_string=json::Encoder::str_encode(&list);
普林顿!(“{}”,编码的_字符串);

目前,无法在结构和枚举上设置边界。这可能会改变,但在此之前,
impl
是定义这些约束的地方

让我们看看特质的定义:
S
E
是它抱怨的东西,希望您定义它们

现在让我们看一下
#[派生(可编码)]
的作用,它使用
rustc编译代码——相当扩展的
,扩展了该属性

#![feature(phase)]
#![no_std]
#![feature(globs)]
#[phase(plugin, link)]
extern crate std = "std#0.11.0-pre";
extern crate native = "native#0.11.0-pre";
extern crate serialize;
use std::prelude::*;
use serialize::{json, Encodable};

pub enum List<T> { Node(T, Box<List<T>>), Nil, }
#[automatically_derived]
impl <__S: ::serialize::Encoder<__E>, __E,
      T: ::serialize::Encodable<__S, __E>> ::serialize::Encodable<__S, __E>
     for List<T> {
    fn encode(&self, __arg_0: &mut __S) -> ::std::result::Result<(), __E> {
        match *self {
            Node(ref __self_0, ref __self_1) => {
                let _e = __arg_0;
                _e.emit_enum("List",
                             |_e|
                                 _e.emit_enum_variant("Node", 0u, 2u, |_e| {
                                                      match _e.emit_enum_variant_arg(0u,
                                                                                     |_e|
                                                                                         (*__self_0).encode(_e))
                                                          {
                                                          Ok(__try_var) =>
                                                          __try_var,
                                                          Err(__try_var) =>
                                                          return Err(__try_var)
                                                      };
                                                      return _e.emit_enum_variant_arg(1u,
                                                                                      |_e|
                                                                                          (*__self_1).encode(_e));
                                                  }))
            },
            Nil => {
                let _e = __arg_0;
                _e.emit_enum("List",
                             |_e|
                                 _e.emit_enum_variant("Nil", 1u, 0u, |_e| {
                                                      return ::std::result::Ok(());
                                                  }))
            }
        }
    }
}
#[automatically_derived]
impl <__D: ::serialize::Decoder<__E>, __E,
      T: ::serialize::Decodable<__D, __E>> ::serialize::Decodable<__D, __E>
     for List<T> {
    fn decode(__arg_0: &mut __D) -> ::std::result::Result<List<T>, __E> {
        __arg_0.read_enum("List",
                          |_d|
                              _d.read_enum_variant(["Node", "Nil"],
                                                   |_d, i|
                                                       ::std::result::Ok(match i
                                                                             {
                                                                             0u
                                                                             =>
                                                                             Node(match _d.read_enum_variant_arg(0u,
                                                                                                                 |_d|
                                                                                                                     ::serialize::Decodable::decode(_d))
                                                                                      {
                                                                                      Ok(__try_var)
                                                                                      =>
                                                                                      __try_var,
                                                                                      Err(__try_var)
                                                                                      =>
                                                                                      return Err(__try_var)
                                                                                  },
                                                                                  match _d.read_enum_variant_arg(1u,
                                                                                                                 |_d|
                                                                                                                     ::serialize::Decodable::decode(_d))
                                                                                      {
                                                                                      Ok(__try_var)
                                                                                      =>
                                                                                      __try_var,
                                                                                      Err(__try_var)
                                                                                      =>
                                                                                      return Err(__try_var)
                                                                                  }),
                                                                             1u
                                                                             =>
                                                                             Nil,
                                                                             _
                                                                             =>
                                                                             ::std::rt::begin_unwind("internal error: entered unreachable code",
                                                                                                     "s.rs",
                                                                                                     4u)
                                                                         })))
    }
}

impl <T> List<T> {
    fn to_json(&self) -> String { json::Encoder::str_encode(self) }
}

目前,无法在结构和枚举上放置边界。这可能会改变,但在此之前,
impl
是定义这些约束的地方

让我们看看特质的定义:
S
E
是它抱怨的东西,希望您定义它们

现在让我们看一下
#[派生(可编码)]
的作用,它使用
rustc编译代码——相当扩展的
,扩展了该属性

#![feature(phase)]
#![no_std]
#![feature(globs)]
#[phase(plugin, link)]
extern crate std = "std#0.11.0-pre";
extern crate native = "native#0.11.0-pre";
extern crate serialize;
use std::prelude::*;
use serialize::{json, Encodable};

pub enum List<T> { Node(T, Box<List<T>>), Nil, }
#[automatically_derived]
impl <__S: ::serialize::Encoder<__E>, __E,
      T: ::serialize::Encodable<__S, __E>> ::serialize::Encodable<__S, __E>
     for List<T> {
    fn encode(&self, __arg_0: &mut __S) -> ::std::result::Result<(), __E> {
        match *self {
            Node(ref __self_0, ref __self_1) => {
                let _e = __arg_0;
                _e.emit_enum("List",
                             |_e|
                                 _e.emit_enum_variant("Node", 0u, 2u, |_e| {
                                                      match _e.emit_enum_variant_arg(0u,
                                                                                     |_e|
                                                                                         (*__self_0).encode(_e))
                                                          {
                                                          Ok(__try_var) =>
                                                          __try_var,
                                                          Err(__try_var) =>
                                                          return Err(__try_var)
                                                      };
                                                      return _e.emit_enum_variant_arg(1u,
                                                                                      |_e|
                                                                                          (*__self_1).encode(_e));
                                                  }))
            },
            Nil => {
                let _e = __arg_0;
                _e.emit_enum("List",
                             |_e|
                                 _e.emit_enum_variant("Nil", 1u, 0u, |_e| {
                                                      return ::std::result::Ok(());
                                                  }))
            }
        }
    }
}
#[automatically_derived]
impl <__D: ::serialize::Decoder<__E>, __E,
      T: ::serialize::Decodable<__D, __E>> ::serialize::Decodable<__D, __E>
     for List<T> {
    fn decode(__arg_0: &mut __D) -> ::std::result::Result<List<T>, __E> {
        __arg_0.read_enum("List",
                          |_d|
                              _d.read_enum_variant(["Node", "Nil"],
                                                   |_d, i|
                                                       ::std::result::Ok(match i
                                                                             {
                                                                             0u
                                                                             =>
                                                                             Node(match _d.read_enum_variant_arg(0u,
                                                                                                                 |_d|
                                                                                                                     ::serialize::Decodable::decode(_d))
                                                                                      {
                                                                                      Ok(__try_var)
                                                                                      =>
                                                                                      __try_var,
                                                                                      Err(__try_var)
                                                                                      =>
                                                                                      return Err(__try_var)
                                                                                  },
                                                                                  match _d.read_enum_variant_arg(1u,
                                                                                                                 |_d|
                                                                                                                     ::serialize::Decodable::decode(_d))
                                                                                      {
                                                                                      Ok(__try_var)
                                                                                      =>
                                                                                      __try_var,
                                                                                      Err(__try_var)
                                                                                      =>
                                                                                      return Err(__try_var)
                                                                                  }),
                                                                             1u
                                                                             =>
                                                                             Nil,
                                                                             _
                                                                             =>
                                                                             ::std::rt::begin_unwind("internal error: entered unreachable code",
                                                                                                     "s.rs",
                                                                                                     4u)
                                                                         })))
    }
}

impl <T> List<T> {
    fn to_json(&self) -> String { json::Encoder::str_encode(self) }
}