@
nagisaushio 我把代码做了一个最小简化,并对生命周期做了一点展开。尝试分析一下原因。你看下对不对。
代码:
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=2de7b9f132bcea057bd22e4b66b966fa1. 在 send 方法上,str 和 self 有同样的生命周期标记,并且 self 是&mut 。这就要求 str 的生命周期必须等于或长于 self 的生命周期。为什么? 因为 rust 看到 self 是&mut ,认为方法内 self 可能会依赖于 str ,比如有 self.0=str 这样的代码,编译器为了保证安全,必须做出这样的假设。这也解释了为什么 self 必须是&mut self ,而&self 不会产生编译错误,因为&self 是不可变的,并不会产生 self.0=str 这样的代码。
2. 之前的代码,Drop trait 只是表象,真正的原因是发生了借用。我最新的代码 main 函数最后一行是 let y = & foo; 这个借用行为,导致 rust 认为,foo 实例相关的依赖的生命周期也至少和 foo 实例的生命周期一样长,而这些依赖,也包含了 send 方法中的 str 。原因如上所说,rust 会假设 send 方法内有:self.0=str ,这样的代码。 但是很明显,传给 str 的 def 在 let y = & foo 之前,被丢弃了,于是导致 rust 假设的 self.0=str 这样的代码无法编译通过。