I настоятельно рекомендую вам вернуться и перечитать Язык программирования Rust , в частности главу о функциях .Этот код, по-видимому, показывает фундаментальные проблемы вокруг всей модели работы функций.
Например, код пытается использовать переменную wtr
в функции callback
без ее прямой передачи.или косвенно.
Если бы такой код работал 1 , программисты, скорее всего, не хотели бы иметь дело с этим языком, потому что было бы почти невозможно сказать что и где значение wtr
даже взято.
Решение простое: передайте любое значение, необходимое фрагменту кода, этому коду.Тогда легко (или проще) определить, откуда взято значение.Есть несколько путей, которые могут работать.
Передать аргумент методу callback
:
use std::io::Write;
impl Process {
fn start<R>(&self, wtr: &mut csv::Writer<R>)
where
R: Write,
{
loop {
// ...
self.callback(wtr, event);
}
}
fn callback<R>(&self, wtr: &mut csv::Writer<R>, event: Event)
where
R: Write,
{
// ...
}
}
fn main() {
// ...
process.start(&mut wtr);
}
Передать аргумент вконструктор и сохраните его внутри структуры:
use std::io::Write;
struct Process<'a, R>
where
R: Write + 'a,
{
wtr: &'a mut csv::Writer<R>,
}
impl<'a, R> Process<'a, R>
where
R: Write,
{
fn new(wtr: &'a mut csv::Writer<R>) -> Self {
Process { wtr }
}
// ...
fn callback(&self, event: Event) {
// ...
self.wtr.write_record(event).unwrap();
self.wtr.flush().unwrap();
}
}
fn main() {
// ...
let process = Process::new(&mut wtr);
}
У кода есть другие проблемы с использованием библиотеки CSV, которые я игнорирую, поскольку они не связаны с вашим вопросом.Я призываю вас начать с более простого куска кода, заставить его работать, а затем сделать его более сложным.Таким образом, вначале вы имеете дело только с более простыми ошибками.
Как только вы поймете это основное использование функций, вы можете узнать о замыканиях .Они позволяют вам «захватывать» переменные из внешней области видимости и передавать их (в тех же двух методах, что и выше) без необходимости иметь дело с определенным количеством или типом переменных.
объекты, созданные внеобласти видимости доступны внутри области видимости
Это верно для одной функции.Это не относится ко всем функциям.
Следовательно, такие вещи, как теневое копирование, разрешены
Затенение не имеет ничего общего с областями видимости.Вам разрешено скрывать в одной области:
let a = Some(32);
let a = a.unwrap();
1 .Такие языки существуют;это языки с динамической областью действия , и некоторые люди предпочитают их.Они в меньшинстве, программы, написанные на этих языках, трудно рассуждать!