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语言中文社区