recursion - 如何递归调用存储在 Arc 中的闭包>?
问题描述
我正在尝试将动态语言转换为 Rust,而闭包是最难实现的部分。
我试过使用 a Arc<Mutex<dyn FnMut>>
,但它不支持递归。
use std::sync::{Arc, Mutex};
type Data = Arc<DataUnpack>;
enum DataUnpack {
Number(f64),
Function(Box<Mutex<FnMut(Vec<Data>) -> Data>>),
}
fn call(f: Data, args: Vec<Data>) -> Data {
if let DataUnpack::Function(v) = &*f {
let f = &mut *v.lock().unwrap();
f(args)
} else {
panic!("TYPE ERR")
}
}
fn lambda(f: Box<FnMut(Vec<Data>) -> Data>) -> Data {
Arc::new(DataUnpack::Function(Box::new(Mutex::new(Box::leak(f)))))
}
fn main() {
let f: Arc<Mutex<Data>> = Arc::new(Mutex::new(Arc::new(DataUnpack::Number(0.0))));
*f.lock().unwrap() = {
let f = f.clone();
lambda(Box::new(move |xs| {
println!("Ha");
call(f.lock().unwrap().clone(), xs.clone())
}))
};
call(f.lock().unwrap().clone(), vec![]);
}
它显示一个Ha
然后停止。我哪里错了?
解决方案
推荐阅读
- github - Github GraphQL 错误:必须指定查询属性并且必须是字符串
- c# - 绑定延迟一步
- c++ - 在 C++ 中打印出返回地址值的二维数组的函数
- ruby-on-rails - JSON 参数在 Specs 中作为空字符串而不是 nil 发送
- excel - @运算符在Excel中的公式前面
- unix - 致命错误:CALL_AND_RETRY_LAST 分配失败 - 节点应用程序的 JavaScript 堆内存不足错误
- python-3.x - 在 Class 之外使用 Def 在短时间内影响 Class
- arrays - 这两个数组有什么区别?
- php - 用ajax获取data-id并在同一个页面传给php
- java - 在国际象棋游戏中,棋子应该移动还是棋盘移动