我正在玩一些Rust Traits和Generics来熟悉这门语言 .
fn main() {
println(test(6f).to_str());
}
enum Result<TS,TE>{
Success(TS),
Error(TE)
}
impl<TS: ToStr, TE: ToStr> ToStr for Result<TS,TE> {
fn to_str(&self) -> ~str {
match *self {
Success(s) => s.to_str(),
Error(e) => e.to_str()
}
}
}
fn test(x:float) -> Result<float,int> {
match x {
0f..5f => Success(x/5f),
_ => Error(1i)
}
}
我上面的代码得到了下面的错误 .
C:\ Users \ mflamer \ Dropbox \ Rust Projects \ Tests \ rust.rs:27:8:27:13错误:退出不可变和指针C:\ Users \ mflamer \ Dropbox \ Rust Projects \ Tests \的取消引用rust.rs:27匹配* self ^ ~~~~
它的构建很好,没有特征上的泛型 . 这里发生了什么?
编辑:如果我将代码更改为此工作 . 不知道为什么 .
enum Result<TS,TE>{
Success{ value:TS },
Error{ error:TE }
}
impl<TS: ToStr, TE: ToStr> ToStr for Result<TS,TE> {
fn to_str(&self) -> ~str {
match *self {
Success{ value: value } => value.to_str(),
Error{ error: error } => error.to_str()
}
}
}
fn test(x:float) -> Result<float,int> {
match x {
0f..5f => Success{ value: x/5f },
_ => Error{ error: 1i }
}
}
1 回答
问题是匹配和通用如何交互 . 以下代码有效:
(唯一的区别是
ref
s . )这意味着
s
和e
是指向self
内部的指针,也就是说,它们的类型为&TS
和&TE
而不是TS
和TE
.没有泛型的
ref
工作的原因是int
和float
是隐式可复制的,所以s
和e
只是从self
复制而来,而对于任意泛型,Rust不能自动复制 .