Добрый день,
Есть один вопрос, который я задавал на stackoverflow (https://stackoverflow.com/questions/70758445/nested-generics-arguments-in-struct-rust),
но не получил внятного ответа. Первый ответ был «неправильное использование дженериков», а другой "T - конкретный тип, и T : io::Write - недостачно. Первый ответ, конечно достаточно внятный, но всё же хотелось понять почему.
Я написал небольшой гист - где по-моему аналогичная идея вполне себе компилируется и работает : https://gist.github.com/xxxxxion/ba438aedef23091256624dc84c44dff7 .
============== [ Дублирую вопрос - перевёл гугл ] ==============
я пишу программу, которая использует текстовый пользовательский интерфейс, и я перенес функциональность TUI в отдельный модуль, который содержит структуру с логикой/переменными TUI.
Объявление структуры:
struct App<'a, T: io::Write>
where
T: io::Write,
{
items_left: StatefulList<String>,
items_right: StatefulList<String>,
input_mode: InputMode,
parser: &'a parser::Parser,
// --- [ Tui Backend ] ---
backend: TermionBackend<T>,
}
and the constructor function implementation is :
impl<'a, T> App<'a, T>
where
T: io::Write,
{
fn new(parser: &'a parser::Parser) -> App<'a, T> {
let stdout = io::stdout().into_raw_mode().unwrap();
let stdout = MouseTerminal::from(stdout);
let stdout = AlternateScreen::from(stdout);
let backend = TermionBackend::new(stdout);
let mut terminal = Terminal::new(backend).unwrap();
let events = Events::new();
App {
items_left: StatefulList::with_items(vec![]),
items_right: StatefulList::with_items(vec![]),
input_mode: InputMode::Normal,
parser,
backend,
}
}
Но я получил ошибку от rust-analyzer :
mismatched types expected struct
TermionBackend<T>
foundstruct TermionBackend<AlternateScreen<MouseTerminal<RawTerminal<Stdout>>>>>
Я хочу использовать дженерики, потому что в TermionBackend много вложенных классов, а его объявление очень большое.
Также я почитал исходник и структура AlternateScreen, то есть T, реализует io::Write типаж, и поэтому я не понимаю, почему возникает ошибка.
============== [ Дублирую вопрос - перевёл гугл ] ==============
Также сейчас немного поменял декларацию на
let backend: TermionBackend<T> = TermionBackend::new(stdout);
И rust-analyzer ругается :
mismatched types expected type parameter
T
found structAlternateScreen<MouseTerminal<RawTerminal<Stdout>>>
Опять же AlternateScreen реализует trait io::Write.