You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中如何创建字符串到函数的映射结构?

问题描述

我正在通过开发 Make a Lisp 项目学习 Rust。在实现求值器步骤时,我需要构建一个关联结构,实现字符串(或其他类型键)到函数的映射。

在我更熟悉的 Ruby、Clojure 等语言中,我可以直接在哈希表中定义匿名函数,示例如下:

{ :+ (fn [a b] (+ a b))
  :- (fn [a b] (- a b)) } ; etc

但在 Rust 中该写法无法通过编译,会触发类型错误:expected closure, found a different closure,对应问题代码如下:

let repl_env = HashMap::new();

repl_env.insert("+", |a, b| a + b);
repl_env.insert("-", |a, b| a - b); // expected closure, found a different closure
已做的排查与推测

我判断报错原因如下:

  • 编译器会将HashMap的泛型类型推断为<&str, 第一个插入闭包的具体类型>
  • 第二个闭包与第一个闭包类型不一致,正如编译器错误提示所述:no two closures, even if identical, have the same type(任意两个闭包,即便实现完全一致,也属于不同类型)

我尝试为闭包参数添加类型标注,让编译器可以推断返回值类型,但问题仍然存在。我猜测需要显式标注闭包本身的类型,但没有在文档中找到对应的实现方法。编译器错误提示建议使用 Box 进行封装,但我用Box::new包裹闭包后依然报错(我此前从未使用过Box)。

待确认的问题
  • 在 HashMap 中存储 Rust 闭包是否是该场景的最优实现?
  • 是否应该使用某种enum来实现映射?(后续开发中我需要支持动态向 Lisp 环境添加用户自定义函数,因此猜测 enum 方案可能不适用)

内容的提问来源于stack exchange,提问作者djb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 00:03:48