2

我正在使用一些 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 }
    }
}
4

1 回答 1

4

问题是匹配和泛型如何交互。以下代码有效:

impl<TS: ToStr, TE: ToStr> ToStr for Result<TS,TE> {
    fn to_str(&self) -> ~str {
        match *self {
            Success(ref s) => s.to_str(),
            Error(ref e)   => e.to_str()
        }
    }
}

(唯一的区别是refs。)

这意味着sande是指向 内部的指针self,也就是说,它们的类型是&TSand&TE而不是TSand TE

ref没有泛型就不能工作的原因是int并且float是隐式可复制的,因此s只是e从 中复制出来self,而对于任意泛型,Rust 无法自动进行复制。

于 2013-05-25T00:51:07.673 回答