如何在结构回调中使用外部对象,例如向CSV追加数据时?

如何在结构回调中使用外部对象,例如向CSV追加数据时?,csv,struct,callback,rust,Csv,Struct,Callback,Rust,我的理解是,在范围外创建的对象在范围内是可用的(因此允许使用阴影之类的东西),但在这种情况下它似乎不起作用: extern crate csv; extern crate rand; use rand::Rng; use std::path::Path; use std::time::SystemTime; #[derive(Debug)] struct Event { time: SystemTime, value: u32, } impl Event { fn

我的理解是,在范围外创建的对象在范围内是可用的(因此允许使用阴影之类的东西),但在这种情况下它似乎不起作用:

extern crate csv;
extern crate rand;

use rand::Rng;
use std::path::Path;
use std::time::SystemTime;

#[derive(Debug)]
struct Event {
    time: SystemTime,
    value: u32,
}

impl Event {
    fn new(t: SystemTime, n: u32) -> Event {
        Event {
            time: SystemTime,
            value: n,
        }
    }
}

struct Process;

impl Process {
    fn new() -> Process {
        Process {}
    }

    fn start(&self) {
        loop {
            let now = SystemTime::now();
            let random_number: u32 = rand::thread_rng().gen();
            let event = Event::new(now, random_number);
            self.callback(event);
        }
    }

    fn callback(&self, event: Event) {
        println!("{:?}", event);
        wtr.write_record(&event).unwrap();
        wtr.flush().unwrap();
    }
}

fn main() {
    let file_path = Path::new("test.csv");
    let mut wtr = csv::Writer::from_path(file_path).unwrap();

    let process: Process = Process::new();
    process.start();
}
错误是:

错误[E0423]:预期值,找到结构'SystemTime'`
-->src/main.rs:17:19
|
17 |时间:系统时间,
|^^^^^^^^^^^^^^由于专用字段,构造函数在此处不可见
错误[E0425]:在此作用域中找不到值'wtr'
-->src/main.rs:41:9
|
41 | wtr.write_记录(&event).unwrap();
|^^^^在此范围内找不到
错误[E0425]:在此作用域中找不到值'wtr'
-->src/main.rs:42:9
|
42 |水冲洗().打开();
|^^^^在此范围内找不到

如何将数据(
事件
)从
进程
的回调函数内部附加到CSV文件?

I强烈鼓励您返回并重新阅读,特别是关于。这段代码似乎展示了函数如何工作的整个模型的基本问题

例如,代码尝试在函数
回调
中使用变量
wtr
,而不直接或间接传入

如果这样的代码有效,程序员可能会讨厌使用这种语言,因为几乎不可能知道值
wtr
来自何处

解决方案很简单:将一段代码所需的任何值传递给该代码。这样就很容易(或更容易)知道价值来自何处。有多种途径可以发挥作用

  • 将参数传递给
    回调
    方法:

    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);
    }
    


    1。这种语言是存在的;它们是语言,有些人更喜欢它们。他们是少数,用这些语言编写的程序很难理解

    你粘贴的第一个错误与你的问题有什么关系?@Shepmaster这与我的问题无关。为了完整起见,我把它包括进去了,因为我不知道如何修复它。。。感谢您回答这个问题,解决方案2是合适的,因为回调函数是由第三方库实现的,我不控制它作为参数传递的内容。我必须再次阅读有关生命周期和where条款的内容。非常感谢。
    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);
    }
    
    let a = Some(32);
    let a = a.unwrap();