首页 文章

泛型和特征错误

提问于
浏览
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 }
    }
}

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()
            }
        }
    }
    

    (唯一的区别是 ref s . )

    这意味着 se 是指向 self 内部的指针,也就是说,它们的类型为 &TS&TE 而不是 TSTE .

    没有泛型的 ref 工作的原因是 intfloat 是隐式可复制的,所以 se 只是从 self 复制而来,而对于任意泛型,Rust不能自动复制 .

相关问题