【发布时间】:2015-05-09 16:05:52
【问题描述】:
这行得通:
struct Foo<T, F>
where
F: Fn() -> Option<T>,
{
f: F,
}
但这给了我编译错误:
struct Bar<I, T, F>
where
F: Fn(I) -> Option<T>,
{
f: F,
}
error[E0392]: parameter `I` is never used
--> src/lib.rs:1:12
|
1 | struct Bar<I, T, F>
| ^ unused parameter
|
= help: consider removing `I`, referring to it in a field, or using a marker such as `std::marker::PhantomData`
error[E0392]: parameter `T` is never used
--> src/lib.rs:1:15
|
1 | struct Bar<I, T, F>
| ^ unused parameter
|
= help: consider removing `T`, referring to it in a field, or using a marker such as `std::marker::PhantomData`
为什么在闭包的返回类型中使用类型参数可以,但在其参数中却不行?
我可以通过将闭包存储为特征对象来解决它:
struct Bar<I, T> {
f: Box<Fn(I) -> Option<T>>,
}
但如果可能的话,我想避免这种情况。
【问题讨论】:
-
这个问题的长答案基本上是rfc 738 on variance
-
" 为什么在闭包的返回类型中使用类型参数可以,但在其参数中却不行?"我怀疑这与闭包返回类型与相应特征上的关联类型建模这一事实有某种联系,而参数类型是该特征的类型参数,但我不确定。
-
@VladimirMatveev 是的,这是在我链接的 rfc 末尾提到的,在 rules for associated types
标签: rust