为结构实现专门化函数实现

Specialise function implementation for a struct implementation

我正在实现一个具有泛型绑定到特征的结构,但是该实现对于具有更多绑定泛型的功能是可取的。下面是示例:

struct A<T> {
   data: T
}

impl <T: AsRef<[u8]>> A<T> {
    fn test(&self, t: &T) {}
    fn more_bound<S: AsRef<[u8]> + PartialEq>(&self, t: &S) {
        self.test(t);  
    }
}

Playground

我不能真正使用专业化,因为我没有实现特征。我也不想定义特征。 除了将 test 的签名更改为 fn test(&self, t: &impl AsRef<[u8]>) {}? 因为这种方法似乎违背了泛型的目的(在这种情况下)。

编译器会抛出一个错误,因为在 more_bound 中你接受了一个 S,然后将它传递给 test,这需要一个 TST 都是 AsRef<[u8]>(并且 T 弱于 S)这一事实无关紧要,因为这些泛型必须匹配固定的具体类型(你答应了一个 &T 但给了一个 &S - 谁知道 &S 是什么)。

您可以简单地将 impl 分成两部分:

impl<T: AsRef<[u8]>> A<T> {
    fn test(&self, t: &T) {}
}

impl<T: AsRef<[u8]> + PartialEq> A<T> {
    fn more_bound(&self, t: &T) {
        self.test(t);
    }
}

第二个 impl 仅适用于 TAsRef<[u8]> + PartialEq。由于此绑定保证此 TAsRef<[u8]>,因此 more_bound 方法可以调用 test,在第一个 impl.

中定义

如果您最初的目标是允许 more_bound 以不同类型调用,则您必须通过 AsRef 自己进行类型转换:

impl <T: AsRef<[u8]>> A<T> {
    // Notice `test`takes the target of `AsRef<[u8]>`
    fn test(&self, t: &[u8]) {}

    fn more_bound<S: AsRef<[u8]> + PartialEq>(&self, t: &S) {
        // `S` can be whatever we want, it never "meets" `T`.
        self.test(t.as_ref()); 
    }
}