giiiiiithub

giiiiiithub

V2EX 第 556477 号会员,加入于 2021-09-21 01:13:56 +08:00
今日活跃度排名 19812
根据 giiiiiithub 的设置,主题列表被隐藏
二手交易 相关的信息,包括已关闭的交易,不会被隐藏
giiiiiithub 最近回复了
必须是考虑语义、Safe 和 Idempotent ,这些性质和 restful 无关,纯纯 rfc2616 中定义的啊。。。
54 天前
回复了 giiiiiithub 创建的主题 Rust rust 生命周期错误
@PTLin

😓

@nagisaushio 给出了等效的构造,这个编译错误要出现,必须有几个条件同时满足,drop check 也只是表象。只说是 drop check 相当于只讲表皮原因。已经在 18 楼解释过了,不对是不是 drop check 再做解释了。除非有新的更为深入的解释。

如果使用生命周期的协变和逆变解释会更为麻烦。
54 天前
回复了 giiiiiithub 创建的主题 Rust rust 生命周期错误
@PTLin 另外,mpmc 的 Sender 实现了 drop ,mpsc 的 Sender 依赖于 mpmc 的 Sender
54 天前
回复了 giiiiiithub 创建的主题 Rust rust 生命周期错误
@PTLin 已经在 18 楼给出了解释,是多个原因综合的结果。不单纯是 drop 的问题,drop 只是表象。
55 天前
回复了 giiiiiithub 创建的主题 Rust rust 生命周期错误
@nagisaushio 我把代码做了一个最小简化,并对生命周期做了一点展开。尝试分析一下原因。你看下对不对。

代码: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=2de7b9f132bcea057bd22e4b66b966fa

1. 在 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 这样的代码无法编译通过。
55 天前
回复了 giiiiiithub 创建的主题 Rust rust 生命周期错误
@buxudashi 我感觉 rust 难的一点是,好像没有文档系统性地讲这些底层逻辑和关系。不知道它到底都有哪些原则。本来以为自己掌握了生命周期,咔咔来几个例子,又懵了。 我觉得这不是语言本身的问题,好像是文档的问题。(也可能是我没找到好的文档
55 天前
回复了 giiiiiithub 创建的主题 Rust rust 生命周期错误
@buxudashi 手误,修改第二条:2. send 方法必须是&mut self ,不能是& self
55 天前
回复了 giiiiiithub 创建的主题 Rust rust 生命周期错误
@buxudashi

这段代码要编译出错必须有几个条件:
1. x 必须在 y 之后创建
2. send 方法必须是&mut self ,不能是&mut self
3. 必须实现 Drop trait

你这个解释也只是解释了为什么有第一个条件
55 天前
回复了 giiiiiithub 创建的主题 Rust rust 生命周期错误
@nagisaushio 不好意思,忘记贴代码了: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=9645f22c4704aa689612a16a0cb8c022

具体来讲 send 方法内部不需要 self.0 = t; 也可以复现同样编译错误。
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3793 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 12ms · UTC 04:29 · PVG 12:29 · LAX 21:29 · JFK 00:29
Developed with CodeLauncher
♥ Do have faith in what you're doing.