我有以下代码:
use std::marker::PhantomData;
struct Magic<T> {
phantom: PhantomData<T>,
}
struct A;
struct B;
impl Magic<A> {
fn value() -> i32 {
5
}
}
impl Magic<B> {
fn value() -> i32 {
10
}
}
impl<T> Magic<T> {
fn extra() -> i32 {
Magic::<T>::value() + 5
}
}
fn main() {}
失败:
error[E0599]: no function or associated item named `value` found for type `Magic<T>` in the current scope
--> src/main.rs:25:9
|
3 | struct Magic<T> {
| --------------- function or associated item `value` not found for this
...
25 | Magic::<T>::value() + 5
| ^^^^^^^^^^^^^^^^^ function or associated item not found in `Magic<T>`
这是有道理的,因为T
不一定是A
或B
。但是,当我调用此函数时,我有信心它将始终为A
或B
。
知道了这一点,我有什么办法可以让这个通用功能使用这些专用功能?
答案 0 :(得分:3)
请注意,这与 specialization 的编程/ Rust概念无关,这通常意味着在某些情况下为性能或性能在特定情况下具有特征的更具体实现。当多个实现可能有效时。
返回并重新阅读The Rust Programming Language,特别是章节"Traits: Defining Shared Behavior"。
通用功能通过特征来表达;介绍一个并使用它,编译器断言您使用的任何类型都可以满足您的需求。无需依赖极其容易犯错的“我有信心”。
trait Value {
fn value() -> i32;
}
impl Value for Magic<A> {
fn value() -> i32 {
5
}
}
impl Value for Magic<B> {
fn value() -> i32 {
10
}
}
impl<T> Magic<T>
where
Self: Value,
{
fn extra() -> i32 {
Magic::<T>::value() + 5
}
}