首页 > 解决方案 > 编译器没有看到关联类型与具体类型相同

问题描述

我的项目中有一点麻烦,我无法解决:编译器没有看到关联类型与具体类型相同,并且不会让我进行分配。

操场

有谁知道如何修理它。感谢您抽出宝贵的时间。

阿托斯

// This program fails to compile 
// Compiler doesn't see that the associated type and type of user id are the same. 
struct User {
    pub id: u64,
}

trait KeyTrait {
    type Key;
    fn key(&self) -> Self::Key;
}

impl KeyTrait for User {
    type Key = u64;
    fn key(&self) -> Self::Key {
        self.id
    }
}

trait PrintTrait {
    fn print_key<K: KeyTrait>(key: K);
}

impl PrintTrait for User {
    fn print_key<K: KeyTrait>(key_impl: K) {
        let id: u64 = key_impl.key(); // Raises error: expected u64, found associated type

        println!("Found key {}", id);
    }
}

fn main() {
    let user = User { id: 5 };
    User::print_key(user);
}

标签: rustassociated-types

解决方案


此代码假设 的每个实现都KeyTrait具有相同的关联Key类型。

impl PrintTrait for User {
    fn print_key<K: KeyTrait>(key_impl: K) {
        let id: u64 = key_impl.key();
        println!("Found key {}", id);
    }
}

事实上,一个实现KeyTrait可以选择任何类型。

您可以在类型系统中对此假设进行编码:

trait PrintTrait {
    fn print_key<K>(key: K)
    where
        K: KeyTrait<Key = u64>;
}

impl PrintTrait for User {
    fn print_key<K>(key_impl: K) 
    where
        K: KeyTrait<Key = u64>,
    {
        let id: u64 = key_impl.key();
    }
}

或者,如果您需要PrintTrait对所有可能的关联Key类型通用:

trait PrintTrait<T> {
    fn print_key<K>(key: K)
    where
        K: KeyTrait<Key = T>;
}

impl PrintTrait<u64> for User {
    fn print_key<K>(key_impl: K) 
    where
        K: KeyTrait<Key = u64>,
    {
        let id: u64 = key_impl.key();
    }
}

推荐阅读