kyonn
V2EX  ›  Rust

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

  •  
  •   kyonn · 5 days ago · 479 views

    如下最简单的一个闭包代码, 外部 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  
       5 days ago
    warning: unused variable: `name`
    kyonn
        2
    kyonn  
    OP
       5 days ago
    @xtreme1 不好意思, 之间主题没编辑完整就发出来了.
    kyonn
        3
    kyonn  
    OP
       5 days ago
    ```rust
    fn print_type<T>(_: &T) {
    println!("{:?}", std::any::type_name::<T>());
    }
    ```

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