为Rust创建多个结构的矢量

brgchamk  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(135)

我对拉斯特还很陌生。所以我可能做了些蠢事。
对于上下文,我正在使用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`
bvhaajcl

bvhaajcl1#

问题不在vec!步骤,而是在render_widget步骤(对于箱形通道)。
问题是Box<dyn Widget>的trait Widget没有实现,看起来问题出在tui-rs的末尾,他们忘记为引用添加一个blanket impl。
你可以试着像@maxim-gritsenko说的那样给出一个参考:f.render_widget(&self.widgets[i], ...)。不过我不确定这是否可行。如果可行,这可能是最好的解决方案。
枚举解决方案可以工作,但是您实际上没有正确地创建枚举。
你需要的是这样的东西:

enum MyWidgets {
  List(tui::widgets::List),
  Block(tui::widgets::Block),
}

let widgets = vec![MyWidgets::List(list), MyWidgets::Block(block)];

for widget in widgets {
  match widget {
    MyWidget::List(list) => f.render_widget(list, ...),
    MyWidget::Block(block) => f.render_widget(block, ...),
  }
}

相关问题