为结构实现专门化函数实现
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);
}
}
我不能真正使用专业化,因为我没有实现特征。我也不想定义特征。
除了将 test
的签名更改为
fn test(&self, t: &impl AsRef<[u8]>) {}
?
因为这种方法似乎违背了泛型的目的(在这种情况下)。
编译器会抛出一个错误,因为在 more_bound
中你接受了一个 S
,然后将它传递给 test
,这需要一个 T
。 S
和 T
都是 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
仅适用于 T
即 AsRef<[u8]> + PartialEq
。由于此绑定保证此 T
是 AsRef<[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());
}
}
我正在实现一个具有泛型绑定到特征的结构,但是该实现对于具有更多绑定泛型的功能是可取的。下面是示例:
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);
}
}
我不能真正使用专业化,因为我没有实现特征。我也不想定义特征。
除了将 test
的签名更改为
fn test(&self, t: &impl AsRef<[u8]>) {}
?
因为这种方法似乎违背了泛型的目的(在这种情况下)。
编译器会抛出一个错误,因为在 more_bound
中你接受了一个 S
,然后将它传递给 test
,这需要一个 T
。 S
和 T
都是 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
仅适用于 T
即 AsRef<[u8]> + PartialEq
。由于此绑定保证此 T
是 AsRef<[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());
}
}