generics - 如何为特征的引用指定一个超特征?
问题描述
我想创建一个特征来强制实现Add
该类型和对该类型的引用的特征。也就是说,如果使用如下所示的 NumberTrait N + N
,&N + &N
两者都应该实现。
use std::ops::Add;
// I think a supertrait needs to be added to NumberTrait,
// something like &Add<Output = Self>, but I don't know
// the correct syntax
pub trait NumberTrait: Sized + Add<Output = Self> {}
fn add_number<N: NumberTrait>(a: N, b: N) -> N {
a + b
}
fn add_number_ref<N: NumberTrait>(a: &N, b: &N) -> N {
a + b // compiler error occurs in this line: an implementation of `std::ops::Add` might be missing for `&N`
}
解决方案
你可以这样做:
use std::ops::Add;
pub trait NumberTrait: Sized + Add<Output = Self>
where
for<'a> &'a Self: Add<Output = Self>,
{
}
fn add_number<N: NumberTrait>(a: N, b: N) -> N
where
for<'a> &'a N: Add<Output = N>,
{
a + b
}
fn add_number_ref<N: NumberTrait>(a: &N, b: &N) -> N
where
for<'a> &'a N: Add<Output = N>,
{
a + b
}
但最有可能的是,您不需要到处都使用该约束,您可以将 where 子句放在add_number_ref
函数上。
推荐阅读
- cuda - 如何使用 Thrust 中的一些预定义序列对向量进行排序
- mysql - Laravel 8 SQLSTATE [HY000] [1045] 用户'forge'@'localhost'的访问被拒绝(使用密码:否)
- powershell - 如果匹配模式后跟下一个模式与power shell中的计数不匹配,则要求添加4行
- html - 如何在 Mapbox gl js 中使用 AWS S3 光栅文件?
- java - java synchronized 无法同步
- angular - .NET Core 3.0 Web Api 和 Angular 10 应用程序可以托管在同一个 AWS EC2 Ubuntu 实例上吗?
- javascript - localStorage 不更新 Django
- php - 如何在MYSQL中组合不同的数据
- dialogflow-es - Ngrok url 每天都会更改我启动 Ngrok
- rust - 在结构内的向量内改变结构