闭包中定义的结构体定义的范围

问题描述 投票:0回答:1

我预计以下代码无法编译,但它确实编译了(playground):

fn main() {
    (0..3)
        .map(|i| {
            struct S {
                v: usize,
            }
            S { v: i }
        })
        .collect::<Vec<_>>();
}

我认为每个闭包调用都会定义一个新的结构类型(及其实例),因此结果无法收集为某种单一类型的向量,但似乎

S
不是那么本地。

这在幕后到底是如何工作的?我想要严格的解释,例如指向 The Rust Reference 页面的链接,因此添加了 #language-lawyer

 标签。


如果你从字面上阅读上面的代码而不知道 Rust 是如何工作的,我认为可以有两种解释,如下所示。我认为第二种解释是正确的,但代码编译的事实意味着第一种解释是正确的。但为什么?这就是我的问题。

解读1

//`S` is *global* in some sense. struct S { v: usize, } //Every invocation of the closure just creates a new instance of the type `S`. for i in 0..3 { vec.push(S { v: 0 }); }

解读2

{ //Every invocation of the closure declares a new struct type // which is local to the invocation. struct __S_anonymous_01 { v: usize, } //And it then creates a new instance of that type. vec.push(__S_anonymous_01 { v: 0 }); } { struct __S_anonymous_02 { v: usize, } vec.push(__S_anonymous_02 { v: 1 }); } { struct __S_anonymous_03 { v: usize, } vec.push(__S_anonymous_03 { v: 2 }); } //And `__S_anonymous_{01|02|03}` are all different // though they have the same structure // because Rust doesn't support duck typing.
    
rust language-lawyer
1个回答
0
投票

https://doc.rust-lang.org/stable/reference/items.html

项目完全在编译时确定,通常在执行期间保持固定,并且可能驻留在只读内存中。

(项目包括结构)。

一般来说,Rust 不定义依赖于值的类型。此外,在函数/闭包内定义的项目(包括例如结构和函数)不能使用值(例如变量)甚至来自其父级的泛型参数,这强化了这样一个事实:项目的嵌套除了可见性之外不会影响任何其他内容。

© www.soinside.com 2019 - 2024. All rights reserved.