generics - 为什么我不能使输入参数通用
问题描述
我正在关注 Rust 编程语言https://doc.rust-lang.org/book/,在第 13 章关于闭包的内容中,我试图让示例代码使用泛型。
我可以使输出值通用如下:
struct Cacher<T, V>
where T: Fn(u32) -> V
{
calculation: T,
value: Option<V>,
}
impl <T, V> Cacher<T, V>
where T: Fn(u32) -> V
{
fn new(calculation: T) -> Cacher<T, V> {
Cacher {
calculation,
value: None,
}
}
}
impl <T> Cacher<T, u32>
where T: Fn(u32) -> u32
{
fn value(&mut self, arg: u32) -> u32 {
match self.value {
Some(v) => v,
None => {
let v = (self.calculation)(arg);
self.value = Some(v);
v
},
}
}
}
但是当我尝试使输入通用时:
struct Cacher<T, I, V>
where T: Fn(I) -> V
{
calculation: T,
value: Option<V>,
}
impl <T, I, V> Cacher<T, I, V>
where T: Fn(I) -> V
{
fn new(calculation: T) -> Cacher<T, I, V> {
Cacher {
calculation,
value: None,
}
}
}
impl <T> Cacher<T, u32, u32>
where T: Fn(u32) -> u32
{
fn value(&mut self, arg: u32) -> u32 {
match self.value {
Some(v) => v,
None => {
let v = (self.calculation)(arg);
self.value = Some(v);
v
},
}
}
}
...我得到 E0392 parameter 'I' is never used
。
我可以理解这I
并不是定义结构的一部分,Cacher
但我还没有找到正确的方法来告诉编译器“T
是任何带有一个参数并返回一个V
”的闭包。我看过一些似乎与此相关的讨论,提到例如PhantomData
但我不太关注它们。有人可以简单地解释一下吗?:)
解决方案
推荐阅读
- c# - EF Core 如何根据对象属性更新实体
- kubernetes - kubeadm 生产现在准备好了吗?
- laravel - Laravel 论坛示例
- javascript - 如何使用 ChartJS 清楚地显示条形图标签?
- python - 在 Python 中模拟蛇和梯子游戏时的问题
- firebase - 如何将来自 pushnotification 的多条消息合并为 reactnative firebase 中的一条消息
- hyperledger-fabric - Hyperledger Composer 上的文件服务器?
- python - 带有字符输入的keras RNN无法预测
- ios - 如何在 Xcode 10.0 的 UITableView 中添加原型单元格
- c# - 使用 MultiMatch 的 Elasticsearch / Nest 搜索,所有其他字段的默认提升