问题描述
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
结构中。
有关该主题的更多信息: