如何在线程中调用成员方法?
普通调用习惯写法
fn watch_receiver(mut self, rx: Receiver<String>) {
thread::spawn(move || {
for line in rx.iter() {
self.push(line);
}
});
}
会报错
p.watch_receiver(rx);
| ------------------ `p` moved due to this method call
70 | p.watch_poly();
| ^^^^^^^^^^^^^^ value borrowed here after move
这里需要把形参self
改为指针&self
,然后在方法体中克隆这个指针,就可以在方法中的线程里直接通过这个指针的克隆成员方法。
改为
fn watch_receiver(&self, rx: Receiver<String>) {
let mut me = self.clone();
thread::spawn(move || {
for line in rx.iter() {
me.push(line);
}
});
}
即可通过。
但是要注意,这里的clone
,真的是克隆。所以clone前后的变量,即self
与me
是2个不同的变量,里面的成员也是在不同的内存空间上,修改self
中的成员属性,me
中对应的成员属性并不会跟着变。所以,如果里面的成员属性需要跟随变化,必须把成员属性定义为指针,这样修改指正所指的值,self
和me
中成员属性所指的值是相同的。