- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以 Rust 为试驾。到目前为止很有趣,但我不确定如何在这种情况下设置特征界限来做一些有用的事情。
Failed to find an implementation of trait serialize::serialize::Encodable,std::io::IoError> for T
在我看来,我需要在枚举 List<T: Encodable>
上设置一个界限.但是,当我尝试这个时,编译器有点不高兴。
error: trait bounds are not allowed in enumeration definitions
所以我假设我必须在实现上设置界限 impl<T:Encodable>
, 但得到这个...
error: wrong number of type arguments: expected 2 but found 0
如果是这样的话,我该如何在 Rust 中做这样的事情?
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)
}
}
当我工作时似乎工作正常不要尝试封装编码,因为它知道 int 是可编码的...
let mut list: List<int> = Nil;
...
let encoded_string = json::Encoder::str_encode(&list);
println!("{}", encoded_string);
最佳答案
目前,边界不能放在结构和枚举上。这可能会改变,但在那之前,impl
是您定义这些约束的地方。
让我们看看特征的定义: Encodable<S: Encoder<E>, E>
. S
和 E
是它提示的事情,希望您定义它们。
现在让我们看看#[deriving(Encodable)]
是什么可以,通过使用 rustc --pretty expanded
编译代码,它扩展了该属性。
#![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) }
}
是的,这很乱。但它显示了 Encodable
正在编写的实现和范围。基本上,约束应该由您以相同的方式编写:您不关心任何特定类型,只关心您有一个编码器。那么,这就是它归结为:
impl<S: Encoder<E>, E, T: Encodable<S, E>> Encodable<S, E> for List<T> {
fn encode(&self, encoder: &mut S) -> Result<(), E> {
…
}
}
关于rust - 枚举和结构上的可编码特征边界问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24443768/
我是一名优秀的程序员,十分优秀!