最近在啃一个Rust项目,被所有权系统整得怀疑人生。编译器比我妈还严格,借个变量要审批,生命周期要写小作文。
怎么说呢
最离谱的是这个坑:
Code
let s = String::from("hello");
let r1 = &s;
let r2 = &mut s; // 报错!
println!("{}", r1);
我觉得吧
明明r1后面没再用了,但编译器不管,它只看作用域。我以为是智能分析,结果是保守策略。Хорошо,这很Rust。
后来懂了NLL(Non-Lexical Lifetimes)也救不了这种,得手动缩小作用域或者重新设计。优雅是优雅,就是头发掉得快。
有同样被borrow checker折磨的朋友吗?你们是怎么跟它和谈的