ZhangHanDong / tao-of-rust-codes

《Rust编程之道》随书源码
https://ruststudy.github.io/tao_of_rust_docs/tao_of_rust/
MIT License
1.18k stars 170 forks source link

[第6章闭包] 定义两个一模一样的闭包不一定属于同一种类型,编译器可以编译通过 #300

Closed DaviRain-Su closed 3 years ago

DaviRain-Su commented 4 years ago

P173页

代码范例

    fn different_closure(){
        let c1 = || { println!("c1");};
        let c2 = || { println!("c2"); };
        let v = [c1, c2];
        for item in v.iter() {
            item();
        }
    }

错误信息

running 1 test
c1
c2
test closure::different_closure ... ok

Rust Playground Link: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=22419e75274995ff389f466c9adb01ed

ZhangHanDong commented 3 years ago
fn main() {
    let c1 = || { "c1";};
    let c2 = || { "c2"; };

    let i = "c3";
    let c3 = || { i };
    let v = [c1, c2, c3];

}

// 报错:

// let c3 = || { i };
//   |              -------- the found closure
// 7 |     let v = [c1, c2, c3];
//   |                      ^^ expected fn pointer, found closure

当闭包没有任何捕获变量的时候,会被强制当成 fn函数指针使用,所以 c1 和 c2 是同类型,c3有了捕获变量,就是个匿名结构体闭包类型。