Этот код предполагает, что каждая реализация 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();
}
}