编译器看不到关联类型与具体类型相同
Compiler doesn't see associates type is the same as concrete type
我的项目中有一点麻烦,我无法解决:编译器看不到关联类型与具体类型相同,不会让我进行赋值。
有谁知道如何修复它。感谢您抽出宝贵时间。
阿托斯
// 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();
}
}
我的项目中有一点麻烦,我无法解决:编译器看不到关联类型与具体类型相同,不会让我进行赋值。
有谁知道如何修复它。感谢您抽出宝贵时间。
阿托斯
// 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();
}
}