我有一个定义关联类型的特征:
pub trait View: Default {
type State;
fn draw(&mut self, state: &mut Self::State);
}
我有一个适用于State
关联类型的类型,但它是泛型的:
pub struct MenuState<I> {
pub items: Vec<I>,
}
以下代码无法编译(Rust 1.66),因为I
不受约束:
#[derive(Default)]
pub struct MenuView {
// fields here
}
impl<I: ToString + Copy> View for MenuView {
type State = MenuState<I>;
fn draw(&mut self, _state: &mut Self::State) { }
}
(注:MenuView
的实施需要ToString
和Copy
的约束)
我知道如何通过添加一些幻影数据来解决这个问题,使I
上的MenuView
成为通用的(参见playground),但它很难看,似乎太复杂了.我觉得上面粘贴的代码只需要一些语法上的修正.
有没有一个简单的解决方案,既不改变View
的特性,也不涉及幻影?
如果由于某种根本原因不能定义语法修复,那是什么原因呢?