如何要求两个特征的关联类型相同?
How to require that the associated types from two traits are the same?
我有以下两个特点:
trait Filter {
type Message;
fn is_valid(&self, message: &Self::Message) -> bool;
}
trait Client {
type Message;
fn send(&self, message: &Self::Message) -> Result<(), Error>;
}
我想要 Filter
和 Client
的实现使用相同的 Message
类型。
struct ClientWithFilter<C: Client, F: Filter> {
filter: F,
client: C,
}
impl<C: Client, F: Filter> ClientWithFilter<C, F> {
/// C::Message or F::Message???
fn check_and_send(&self, message: &C::Message) -> Result<(), Error> {
if self.filter.is_valid(message) {
self.client.send(message)
} else {
Err(Error::MessageInvalid)
}
}
}
这不编译:
if self.filter.is_valid(message) {
| ^^^^^^^ expected client::Filter::Message, found client::Client::Message
|
= note: expected type `&<F as client::Filter>::Message`
found type `&<C as client::Client>::Message`
编译器看到 2 种不同的类型,而我希望只有一种。
我怎样才能以正确的方式用 Rust 编写它?
您需要适当地约束类型参数:
struct ClientWithFilter<C, F>
where
C: Client,
F: Filter<Message = C::Message>,
{
filter: F,
client: C,
}
impl<C, F> ClientWithFilter<C, F>
where
C: Client,
F: Filter<Message = C::Message>,
{
fn check_and_send(&self, message: &C::Message) -> Result<(), Error> {
if self.filter.is_valid(message) {
self.client.send(message)
} else {
Err(Error::MessageInvalid)
}
}
}
我认为,目前有必要对 impl 的约束进行冗余重复。我相信有一个 RFC 可以让 impls 从结构定义中继承约束。
我有以下两个特点:
trait Filter {
type Message;
fn is_valid(&self, message: &Self::Message) -> bool;
}
trait Client {
type Message;
fn send(&self, message: &Self::Message) -> Result<(), Error>;
}
我想要 Filter
和 Client
的实现使用相同的 Message
类型。
struct ClientWithFilter<C: Client, F: Filter> {
filter: F,
client: C,
}
impl<C: Client, F: Filter> ClientWithFilter<C, F> {
/// C::Message or F::Message???
fn check_and_send(&self, message: &C::Message) -> Result<(), Error> {
if self.filter.is_valid(message) {
self.client.send(message)
} else {
Err(Error::MessageInvalid)
}
}
}
这不编译:
if self.filter.is_valid(message) {
| ^^^^^^^ expected client::Filter::Message, found client::Client::Message
|
= note: expected type `&<F as client::Filter>::Message`
found type `&<C as client::Client>::Message`
编译器看到 2 种不同的类型,而我希望只有一种。 我怎样才能以正确的方式用 Rust 编写它?
您需要适当地约束类型参数:
struct ClientWithFilter<C, F>
where
C: Client,
F: Filter<Message = C::Message>,
{
filter: F,
client: C,
}
impl<C, F> ClientWithFilter<C, F>
where
C: Client,
F: Filter<Message = C::Message>,
{
fn check_and_send(&self, message: &C::Message) -> Result<(), Error> {
if self.filter.is_valid(message) {
self.client.send(message)
} else {
Err(Error::MessageInvalid)
}
}
}
我认为,目前有必要对 impl 的约束进行冗余重复。我相信有一个 RFC 可以让 impls 从结构定义中继承约束。