解决参数性状缺乏相关方法的问题?

时间:2015-01-11 14:18:05

标签: rust

注意:我知道Rust invoke trait method on generic type parameter,不幸的是,那里描述的工作对我来说似乎没有用,可能是因为我的特性是参数化的。


我尝试使用相关方法实现参数化特征:

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之外,我愿意接受解决方案的建议。

1 个答案:

答案 0 :(得分:1)

在第一个链接中给出的用于指定Self的虚拟参数的解决方法似乎有效;调整为:

fn static_call<'a>(t: &'a T, _unused: Option<Self>) -> &'a T;

// ...

    Parameterized::static_call(t, None::<P>)

为我编制罚款。

(顺便说一下,这似乎是相关类型trait Parameterized { type T;可能有用的情况,但它不能解决这个问题,可能与您真实的非简化代码完全不同。)