rust - 编译器没有看到关联类型与具体类型相同
问题描述
我的项目中有一点麻烦,我无法解决:编译器没有看到关联类型与具体类型相同,并且不会让我进行分配。
有谁知道如何修理它。感谢您抽出宝贵的时间。
阿托斯
// 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();
}
}
推荐阅读
- clang-tidy - 如何仅在源文件而不是所有标题中将 clang-tidy 约束为 FIX-IT
- python - 在python中通过变量调用类
- java - Java 9 如何避免拆分包
- angular - NavController 在 Ionic 4 中不起作用
- javascript - 计算表格列
- outlook - 将加载项列入 Outlook 移动列表白名单的审批流程是什么?
- javascript - 在反应中,如何将对象存储在数组中并将数组索引迭代1?
- reactjs - 类方法React.Component的类型注解怎么写?
- amazon-web-services - AWS S3 在文件名中出现锚点问题#
- angular-material - Angular Material Select 未显示默认选择