【问题标题】:Rust "cannot determine a type for this bounded type parameter: unconstrained type"Rust“无法确定此有界类型参数的类型:无约束类型”
【发布时间】:2014-08-09 18:13:39
【问题描述】:

我刚开始摆弄 Rust,发现一个我不明白的错误,试图构建类似 DSL 的东西。

我已经定义了一个这样的结构:

struct Thing<T> {
     a: T
}

impl<T: Show> Thing<T> {
   fn selfie<T>(&self) -> Thing<T> { Thing { a: self.a } }
   fn say<T>(&self) { println!("sing") }
}

然后我这样称呼它并得到错误:

let a = Thing { a: 1i }; // works
a.say(); // works
let s = a.selfie(); //works
s.say(); // error

main.rs:49:5: 49:12 error: cannot determine a type for this bounded type parameter: unconstrained type
main.rs:49     s.say();
               ^~~~~~~

有谁知道这个错误是什么意思?我很难弄清楚,并且尝试了几种不同的演员阵容,但似乎没有任何效果。

或者,有没有更好的方法来返回对“self”的引用(这是我在“selfie”方法中真正想要做的,但由于引用寿命而出现错误)或“等效结构”同类”?

【问题讨论】:

    标签: compiler-errors rust


    【解决方案1】:

    这使用最新的 Rust 版本编译。

    use std::fmt::Show;
    
    struct Thing<T> {
         a: T
    }
    
    impl<T: Show + Clone> Thing<T> {
       fn selfie(&self) -> Thing<T> { Thing { a: self.a.clone() } }
       fn say(&self) { println!("sing: {}", self.a) }
    }
    

    我假设 say 方法实际上应该打印 a(因为否则 Show 绑定没有意义)。

    问题在于say&lt;T&gt; 中存在泛型类型 T 但无法推断,因为它没有被使用。在自拍方法中,不需要&lt;T&gt;。如果我们想克隆它,我们确实需要将 T 限制为那些实现 Clone 的类型。

    我还应该指出selfie 方法正在重新发明clone。你可以这样做:

    #[deriving(Clone)]
    struct Thing<T> {
         a: T
    }
    

    然后调用clone() 而不是selfie

    【讨论】:

    • 你说得对,say 应该打印a,我之前对其进行了简化以排除println 出错的可能性。我刚试过,确实有效,感谢您的解释和解决方案!
    • 哦!关于派生Clone,我故意复制了克隆行为,因为这是一个DSL,但是派生克隆确实使它不那么冗长。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    相关资源
    最近更新 更多