我对拉斯特还很陌生。所以我可能做了些蠢事。
对于上下文,我正在使用tui-rs创建一个小型终端应用程序,这是相关的清理代码。
use tui::widgets::{Block, List, Widget};
pub struct UI {
widgets: Vec<Box<dyn Widget>>,
}
let block = Block::default().title("Block").borders(Borders::ALL);
let list = List::new(items)
.block(Block::default().title("List").borders(Borders::ALL))
.style(Style::default().fg(Color::White))
.highlight_style(Style::default().add_modifier(Modifier::ITALIC))
.highlight_symbol(">>");
let widgets = vec![Box::new(block),Box::new(list)];
for i in 0..self.widgets.len() {
f.render_widget(self.widgets[i], self.chunks[i]);
}
...
现在你知道我想要达到什么目的了,但是我在f.render_widget(self.widgets[i], self.chunks[i])
上总是得到这个错误;
the trait bound `std::boxed::Box<dyn tui::widgets::Widget>: tui::widgets::Widget` is not satisfied
the following other types implement trait `tui::widgets::Widget`:
tui::widgets::BarChart<'a>
tui::widgets::Block<'a>
tui::widgets::Chart<'a>
tui::widgets::Clear
tui::widgets::Gauge<'a>
tui::widgets::LineGauge<'a>
tui::widgets::List<'a>
tui::widgets::Paragraph<'a>
and 4 othersrustcE0277
terminal.rs(99, 12): required by a bound in `tui::Frame::<'a, B>::render_widget`
我甚至尝试过枚举方法
struct Widgets{
List,
Box
}
pub struct UI {
widgets: Vec<Widgets>,
}
let widgets = vec![block,list];
现在错误出现在let widgets = vec![block,list];
上
mismatched types
expected enum `ui::Widgets`, found struct `tui::widgets::List`
1条答案
按热度按时间bvhaajcl1#
问题不在
vec!
步骤,而是在render_widget
步骤(对于箱形通道)。问题是
Box<dyn Widget>
的traitWidget
没有实现,看起来问题出在tui-rs的末尾,他们忘记为引用添加一个blanket impl。你可以试着像@maxim-gritsenko说的那样给出一个参考:
f.render_widget(&self.widgets[i], ...)
。不过我不确定这是否可行。如果可行,这可能是最好的解决方案。枚举解决方案可以工作,但是您实际上没有正确地创建枚举。
你需要的是这样的东西: