再探:如何将不可变的参数传递给线程? 关于终生

问题描述

This my question已回答。

但是,当我稍稍修改代码时,它就不会再次工作,并且出现类似于上一个问题中的错误的编译错误。我现在怎么了?

use std::thread;

#[derive(Clone)]
struct Params<'a> {
    x: &'a i32,}

struct State<'a> {
    params: &'a Params<'a>,y: i32,}

impl<'a> State<'a> {
    fn new(params: &'a Params<'a>) -> Self {
        State {
            params,y: 0,}
    }
    fn start(&mut self) -> thread::JoinHandle<()> {
        let params = self.params.clone();
        thread::spawn(move || { params; /* ... */ })
    }
}
error[E0495]: cannot infer an appropriate lifetime due to conflicting requirements
  --> src/lib.rs:21:34
   |
21 |         let params = self.params.clone();
   |                                  ^^^^^
   |
note: first,the lifetime cannot outlive the lifetime `'a` as defined on the impl at 13:6...
  --> src/lib.rs:13:6
   |
13 | impl<'a> State<'a> {
   |      ^^
note: ...so that the types are compatible
  --> src/lib.rs:21:34
   |
21 |         let params = self.params.clone();
   |                                  ^^^^^
   = note: expected `&Params<'_>`
              found `&Params<'a>`
   = note: but,the lifetime must be valid for the static lifetime...
note: ...so that the type `[closure@src/lib.rs:22:23: 22:52 params:Params<'_>]` will meet its required lifetime bounds
  --> src/lib.rs:22:9
   |
22 |         thread::spawn(move || { params; /* ... */ })
   |         ^^^^^^^^^^^^^

解决方法

我建议不要使用引用计数类型(Arc),而不必使用引用,那样您就不必担心生存期了。

const draggableElements = document.querySelectorAll(".draggable");
const droppableElements = document.querySelectorAll(".droppable");

draggableElements.forEach(elem => {
    elem.addEventListener("dragstart",dragstart);
    elem.addEventListener("drag",drag);
    elem.addEventListener("dragend",dragend);  
});

//droppableElements.forEach(elem => {
//  //elem.addEventListener("dragenter",dragenter);
//  //elem.addEventListener("dragover",dragover);
//  //elem.addEventListener("dragleave",dragleave);
//  //elem.addEventListener("drop",drop);
//});

    // Drag and Drop Functions
    function dragStart(event) {
        console.log("dragging...")
        //event.dataTransfer.setData("text",event.target.color);
    }
    
    function dragOver(event) {
        event.PreventDefault();***

如果以后要更改状态,则需要使用use std::thread; use std::sync::Arc; #[derive(Clone)] struct Params { x: i32,} struct State { params: Arc<Params>,y: i32,} impl State { fn new(params: &Arc<Params>) -> Self { State { params: params.clone(),y: 0,} } fn start(&self) -> thread::JoinHandle<()> { let params = self.params.clone(); thread::spawn(move || { params; /* ... */ }) } } 之类的Mutex将Params类型包装在State结构中。

有关该主题的更多信息: