注意:我知道 Rust invoke trait method on generic type parameter ,不幸的是,那里描述的解决方法似乎对我不起作用,可能是因为我的特征是参数化的。
我尝试使用关联方法实现参数化 trait:
trait Parameterized<T> {
fn static_call<'a>(t: &'a T) -> &'a T;
}
struct Foo;
impl Parameterized<u32> for Foo {
fn static_call<'a>(t: &'a u32) -> &'a u32 { t }
}
目标当然是之后使用这样的方法:
struct PP<T, P: Parameterized<T>> {
p: P
}
impl<T, P> PP<T, P>
where P: Parameterized<T>
{
fn call_it<'a>(t: &'a T) -> &'a T {
P::static_call(t)
}
}
但不幸的是,事情从这里走下坡路。这里给出的语法是最明显的,但是相关的方法还没有实现,因此编译器拒绝代码(带有莫名其妙的错误消息):
error: failed to resolve. Use of undeclared type or module `P`
P::static_call(t)
^~~~~~~~~~~~~~
好吧,那我们试试上一个问题中描述的解决方法吧!
impl<T, P> PP<T, P>
where P: Parameterized<T>
{
fn call_it<'a>(t: &'a T) -> &'a T {
Parameterized::<T>::static_call(t)
}
}
结果是:
error: type annotations required: cannot resolve `_ : Parameterized<T>`
Parameterized::<T>::static_call(t)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
这很公平,因为编译器确实无法推断出我指的是 Parameterized<T>
的特定实现。对于 P
.然后让我们选择用于关联类型的语法:
impl<T, P> PP<T, P>
where P: Parameterized<T>
{
fn call_it<'a>(t: &'a T) -> &'a T {
<P as Parameterized<T>>::static_call(t)
}
}
不,也不起作用:
error: unexpected token: `<`
<P as Parameterized<T>>::static_call(t)
^
所以这不是注释的方式。
除了添加 &self
之外,我愿意接受解决方法的建议显然。
最佳答案
在您的第一个链接中给出的使用虚拟参数指定 Self
的解决方法似乎可行;调整到:
fn static_call<'a>(t: &'a T, _unused: Option<Self>) -> &'a T;
// ...
Parameterized::static_call(t, None::<P>)
为我计算罚款。
(顺便说一下,这看起来像是关联类型的情况,trait Parameterized { type T;
可能有用,但它并没有解决这个问题,而且可能与你真正的、非减少代码。)
关于rust - 解决参数特征缺乏相关方法的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27888069/