rust - 解决参数特征缺乏相关方法的问题?

标签 rust

注意:我知道 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/

相关文章:

enums - 我如何只匹配枚举的部分而不是所有变体?

generics - 如何初始化常量泛型数组?

rust - 你能得到一个集合的所有值的迭代器,除了一个和对该元素的引用吗?

oop - 为什么 Rust 不支持特征对象向上转换?

json - 同时支持 serde_json::Value 和 cbor_json::Value

rust - 在no_std环境中,我该如何替换Vec和HashSet?

rust - Rust说不使用导入,并且无法同时找到导入的语句

arrays - 使用 Rust 如何将二维数组转换为二维向量?

asynchronous - 如何将变量传递给异步函数?

rust - 使用 Kuchiki 解析字节时出现 'expected slice, found u8' 错误