rust - 有什么办法可以让通用函数使用专用函数?
问题描述
我有以下代码:
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
or B
。但是,当我调用此函数时,我确信它始终是A
or B
。
知道了这一点,有什么办法可以让这个通用函数使用这些专用函数吗?
解决方案
请注意,这与专业化的编程/Rust 概念无关,这通常意味着在某些情况下为了性能或多个实现可能有效时对特征进行更具体的实现。
返回并重新阅读Rust 编程语言,特别是“特征:定义共享行为”一章。
通用功能通过特征来表达;引入一个并使用它,编译器断言您使用的任何类型都可以满足您的需求。没有必要依赖极其容易犯错的“我有信心”。
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
}
}