fn render_task_enter_field<W>(stdout: &mut W)
where
W: Write,
{
...
}
Мне нужно добавить эту функцию в вектор. Я буду повторять это и вызывать каждую функцию.
Я пробовал Vec<fn(&mut impl Write)>
, но не работает
Как я могу вызвать свою функцию? Я хочу передать в эту функцию описанную ниже переменную.
let mut stdout = stdout()
.into_raw_mode()
.expect("Cannot run raw mode")
.into_alternate_screen()
.expect("Cannot run alternate screen");
Я использую ящик Termion
Согласно Как создать неоднородную коллекцию объектов? вам нужно сделать типы однородными для хранения в векторе. Вместо этого, возможно, что-то вроде fn render(stdout: &dyn Write)
. ИЛИ вам нужно, чтобы W
означало одно и то же для всех элементов.
Вы хотите это:
Vec<Box<dyn Fn(&mut dyn Write)>>
Вектор блоков, содержащий функцию динамического типа, которая принимает динамический объект, реализующий запись.
Вы не можете добавлять в массив общие функции, поскольку на самом деле это просто набор отдельных функций, но вы можете просто заставить его принимать объект типажа в качестве аргумента, чтобы получить тот же эффект.
Полный пример:
use std::io::Write;
fn render_task_enter_field(stdout: &mut dyn Write)
{
}
fn main() {
let mut k:Vec<Box<dyn Fn(&mut dyn Write)>> = vec![];
k.push(Box::new(render_task_enter_field));
for m in k {
m(&mut std::io::stdout());
}
}
Спасибо за ответ, но у меня еще есть вопрос. Как мне теперь вызвать нажатую функцию? :) Я отредактирую свой вопрос прямо сейчас
@ArtemNovikov Я добавил пример вызова функции. Box реализует Deref
, поэтому обычно его можно рассматривать как внутренний тип. Для вызова функции не требуется ничего особенного.
С таким же успехом это могло бы быть более эффективно fn(&mut dyn Write)
.
@ChayimFriedman Правда, в этом случае вы не сможете добавить замыкания в массив.
Вы можете использовать это с mut
fn render_task_enter_field<W: Write + ?Sized>(stdout: &mut W) {
writeln!(stdout, "Hello, world!").unwrap();
}
fn main() {
let mut v: Vec<Box<dyn Fn(&mut dyn Write)>> = Vec::new();
for _ in 0..10 {
v.push(Box::new(|stdout: &mut dyn Write| {
render_task_enter_field(stdout);
}));
}
}
С таким же успехом это могло бы быть более эффективно fn(&mut dyn Write)
.
Указатель функции не может быть универсальным. Можете ли вы подробнее рассказать о своем варианте использования?