Rust异步爬虫实战

@原子之音 带来的用 async-std + surf 以及 tokio + reqwest 库来教大家写一个爬虫~ 小编也许可以试着用这个抓一下 彩票的分析数据然后来深度一下~

bilibili: https://www.bilibili.com/video/BV1tX4y1u7wg?from=search&seid=9375060030658381444

类型标记了之后,反而可以通过编译?

这是今天在 QQ Rust 社区 1 群里面发出的问题,代码如下:

fn fn1(s: &mut String) {}
fn main() {
let mut s = "".to_string();
let s1 = &mut s;
fn1(s1); // s1 没有失效
s1.len();
{
let s2: &mut String = s1;
}
s1.len(); // s1 没有失效

{
let s2 = s1;
}
s1.len(); // s1 失效了
}

play 一下

有群友帮忙追溯了一下,原来这个问题历史还挺久远的, 原来,我们在声明 s2 的时候,当我们标记成 &mut String 类型的时候,rust 编译器知道 s2 也需要一个独占的可变引用,于是就触发了 “reborrow coercion”机制,把 s1 可变引用赋予给 s2, 同时在第一个大括号里面冻结了 s1 变量,而在第一个大括号结束了之后, s2 生命周期结束, s1 也就被解冻了。而在第二个大括号里面,因为 rust 编译器不知道应当给 s2 推断成什么类型,于是干脆就转移(move) s1 到 s2, 使得原本的 s1在转移之后失效,只剩下 s2, 所以 不能在 let s2 = s1; 之后使用 s1了。

--

社区学习交流平台订阅:

  • Rustcc论坛: 支持rss
  • 微信公众号:Rust语言中文社区