kyonn
V2EX  ›  Rust

如何理解 rust 闭包的借用值机制? 被借用的值在闭包内到底是什么类型?

  •  
  •   kyonn · May 14 · 963 views
    This topic created in 39 days ago, the information mentioned may be changed or developed.

    如下最简单的一个闭包代码, 外部 let 定义的 name 类型是 String, 那么根据 rust 闭包的借用值机制, 闭包内使用的 name 是对外部的引用, 那么闭包表达式内的 name 类型应该是 &String 才对, 包括 AI 也是这么回答的.

    但是我用 rust 的代码去打印闭包内的 name 类型, 以及 VSCode rust-lang.rust-analyzer 分析显示 name 类型都是 String.

    let name = String::from("hello");
    
    let f1 = || println!("{}", name);
    
    
    5 replies    2026-05-19 20:31:18 +08:00
    xtreme1
        1
    xtreme1  
       May 14
    warning: unused variable: `name`
    kyonn
        2
    kyonn  
    OP
       May 14
    @xtreme1 不好意思, 之间主题没编辑完整就发出来了.
    kyonn
        3
    kyonn  
    OP
       May 14
    ```rust
    fn print_type<T>(_: &T) {
    println!("{:?}", std::any::type_name::<T>());
    }
    ```

    打印类型用的这个辅助函数
    kyonn
        5
    kyonn  
    OP
       May 19
    @lance6716 感谢, 我最终也是找到了这份官方文档, 又结合一些其他资料, 是这样的结论, 不知道是否正确:
    1. 从机器码角度或者编译后的角度看, 闭包内的 name 确实只是 String 的引用.
    2. 从类型系统角度, 为了不让开发者误解保持思维连续性, rust 环境还是将闭包内的 name 解析为 String 类型
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1348 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 17:05 · PVG 01:05 · LAX 10:05 · JFK 13:05
    ♥ Do have faith in what you're doing.