如何在结构回调中使用外部对象,例如向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();