gpt4 book ai didi

rust - 编译器看不到关联类型与具体类型相同

转载 作者:行者123 更新时间:2023-11-29 08:17:28 24 4
gpt4 key购买 nike

我的项目中有一个小麻烦,我无法解决:编译器看不到关联类型与具体类型相同,不会让我进行赋值。

Playground

谁知道怎么解决。感谢您抽出宝贵时间。

阿托斯

// 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);
}

最佳答案

此代码假设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();
}
}

关于rust - 编译器看不到关联类型与具体类型相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58448956/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com