V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  giiiiiithub  ›  全部回复第 1 页 / 共 5 页
回复总数  100
1  2  3  4  5  
必须是考虑语义、Safe 和 Idempotent ,这些性质和 restful 无关,纯纯 rfc2616 中定义的啊。。。
6 天前
回复了 xyxy 创建的主题 数据库 海量数据存储问题,求大佬们指导选型
上 olap
36 天前
回复了 giiiiiithub 创建的主题 Rust rust 生命周期错误
@PTLin

😓

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

如果使用生命周期的协变和逆变解释会更为麻烦。
36 天前
回复了 giiiiiithub 创建的主题 Rust rust 生命周期错误
@PTLin 另外,mpmc 的 Sender 实现了 drop ,mpsc 的 Sender 依赖于 mpmc 的 Sender
36 天前
回复了 giiiiiithub 创建的主题 Rust rust 生命周期错误
@PTLin 已经在 18 楼给出了解释,是多个原因综合的结果。不单纯是 drop 的问题,drop 只是表象。
36 天前
回复了 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 这样的代码无法编译通过。
37 天前
回复了 giiiiiithub 创建的主题 Rust rust 生命周期错误
@buxudashi 我感觉 rust 难的一点是,好像没有文档系统性地讲这些底层逻辑和关系。不知道它到底都有哪些原则。本来以为自己掌握了生命周期,咔咔来几个例子,又懵了。 我觉得这不是语言本身的问题,好像是文档的问题。(也可能是我没找到好的文档
37 天前
回复了 giiiiiithub 创建的主题 Rust rust 生命周期错误
@buxudashi 手误,修改第二条:2. send 方法必须是&mut self ,不能是& self
37 天前
回复了 giiiiiithub 创建的主题 Rust rust 生命周期错误
@buxudashi

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

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

具体来讲 send 方法内部不需要 self.0 = t; 也可以复现同样编译错误。
37 天前
回复了 giiiiiithub 创建的主题 Rust rust 生命周期错误
@nagisaushio 感谢,我简化了一下你的代码,也理解了其中一部分原委。这份代码编译错误,一部分是因为 Foo 实例的生命周期和被发送给&str 被标记了同样的生命周期'a 。

但是我还有不解:
1. 这份代码如果不实现 Drop 接口也能编译并运行通过,根本原因是什么?不实现 Drop 接口就不会释放吗?
37 天前
回复了 giiiiiithub 创建的主题 Rust rust 生命周期错误
@nagisaushio 老哥,Channel 的 Sender 是咋获取到的?这俩传参是一样的
37 天前
回复了 giiiiiithub 创建的主题 Rust rust 生命周期错误
@araraloren 是的,多语言,脑子切换不及时
37 天前
回复了 giiiiiithub 创建的主题 Rust rust 生命周期错误
@nagisaushio 可是把顺序不变,y 换成下边的代码,也是正常:

```
#[derive(Debug)]
struct Foo;

impl Foo {
fn send(&self, t: &str) {
println!("{}", t)
}
}

fn main() {
{
// let a = mpsc::channel();
// let y:Sender<&str> = a.0;

let y = Foo;
let x = String::from("abc");
let s = &(x[..]);
y.send(s);
}
}
```
38 天前
回复了 giiiiiithub 创建的主题 Rust rust 生命周期错误
@nagisaushio 可是为什么 x 会比 a 先 drop ?
51 天前
回复了 mercurylanded 创建的主题 Java 发现个好玩的事情
@darkengine 我给的代码是解释崩的原因,不是避免崩掉
52 天前
回复了 mercurylanded 创建的主题 Java 发现个好玩的事情
论括弧的重要性:

("\"" + d == null) ? "" : d.toString()
@coolrequest 我觉得很好用,尤其是对于开发人员,其实不用 UI ,而是直接写 idea 的.http 文件更方便。当然它自身支持的特性不够多,但是对于开发人员自测接口胜在方便。
虽然但是,还是最喜欢 idea 自带的 http client
1  2  3  4  5  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   958 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 21ms · UTC 20:42 · PVG 04:42 · LAX 13:42 · JFK 16:42
Developed with CodeLauncher
♥ Do have faith in what you're doing.