【问题标题】:How to provide a proper type for use of generic impl?如何为泛型 impl 的使用提供合适的类型?
【发布时间】:2020-06-14 18:06:27
【问题描述】:

我正在尝试建立我对 Rust 中关联类型的直觉。在我的实验中,我构建了泛型和实现的这种(荒谬的)组合。

struct MyStruct<T>{
    t:T
}

trait MyTrait {
    type T1;
    fn tt(x:Self::T1) -> MyStruct<Self::T1>;
}

impl<T> MyTrait for MyStruct<T> {
    type T1=T;
    fn tt(a:Self::T1) -> MyStruct<Self::T1> {
        MyStruct{t:a}
    }

}

它可以编译,但问题是我不能使用'tt'函数。


fn main() {
    let x = MyTrait::tt(1);
}

导致错误:cannot infer type

我已经尝试了为 Rust 提供类型提示的选项,但我尝试的越多,(对我来说)错误消息就越少。

有人可以从上面为我提供使用MyTrait::tt 函数的示例,还是这是一个死胡同?如果有,为什么?

【问题讨论】:

    标签: generics rust associated-types


    【解决方案1】:

    使用MyTrait::tt(1) 之类的问题在于,无法从参数1 推导出实现MyTrait 的实际类型。例如,您可以为String 实现MyTrait,但使T1 成为i32。通过该设置,MyTrait::tt(1) 可以引用&lt;String as MyTrait&gt;::tt(使用完全限定的方法调用语法)。另一方面,您也可以使用T1 = i32i32 实现MyTrait。那么MyTrait::tt(1)也可以引用&lt;i32 as MyTrait&gt;::tt

    impl MyTrait for String {
        type T1 = i32;
        fn tt(x: i32) -> MyStruct<i32> {
            MyStruct { t: x }
        }
    }
    
    impl MyTrait for i32 {
        type T1 = i32;
        fn tt(x: i32) -> MyStruct<i32> {
            MyStruct { t: x }
        }
    }
    
    fn main() {
        let x = 47_i32;
    
        // let y = MyTrait::tt(x);
        // That could refer to either of the following
        let y = <String as MyTrait>::tt(x);
        let z = <i32 as MyTrait>::tt(x);
    
        // Of course, you don't need the fully qualified syntax
        // all the time.
        let y2 = String::tt(x);
        let z2 = i32::tt(x);
    }
    

    (playground)

    这种行为可能会通过更智能的特征求解器得到改善,因为在您的特定情况下,唯一适用的实现是 MyStruct&lt;i32&gt; 上的实现。但现在,我只想使用&lt;MyStruct&lt;i32&gt; as MyTrait&gt;::tt(1) 或简单的MyStruct::tt(1)

    fn main() {
        let x = <MyStruct<i32> as MyTrait>::tt(1);
        let x = MyStruct::tt(1);
    }
    

    (playground)

    要了解有关特征和完全限定语法的更多信息,请查看The Book's chapter on advanced traits.

    【讨论】:

    • 非常感谢!我将继续战斗通过这部分。我不知道为什么这么难掌握。
    猜你喜欢
    • 2010-11-09
    • 1970-01-01
    • 2017-12-06
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多