< 返回版块

huangjj27 发表于 2020-12-15 22:55

Rust异步爬虫实战

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

bilibili

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

这是今天在 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) s1s2, 使得原本的 s1在转移之后失效,只剩下 s2, 所以 不能在 let s2 = s1; 之后使用 s1了。

评论区

写评论

还没有评论

1 共 0 条评论, 1 页