乐闻世界logo
搜索文章和话题

Is it possible to make a recursive closure in Rust?

1个答案

1

Implementing recursive closures in Rust is slightly complex, but it is achievable. Rust closures typically cannot directly call themselves recursively because their type is not fully determined at the time of definition. However, we can achieve recursive calls for closures using certain methods.

Method One: Using Dynamic Dispatch with Box

We can achieve recursion by placing the closure inside a Box and using dynamic dispatch to call it. However, this approach incurs performance overhead due to dynamic dispatch and heap allocation.

rust
fn main() { let factorial: Box<dyn Fn(i32) -> i32> = Box::new(|x| { if x == 1 { 1 } else { x * factorial(x - 1) } }); println!("5! = {}", factorial(5)); }

This example will result in an error because the closure attempts to capture its own factorial, but the closure is not fully formed at the time of definition.

Method Two: Using Rc and RefCell

By utilizing Rc and RefCell, we can create a mutable, reference-counted closure that enables recursive self-calls.

rust
use std::rc::Rc; use std::cell::RefCell; fn main() { let factorial = Rc::new(RefCell::new(None as Option<Box<dyn Fn(i32) -> i32>>)); *factorial.borrow_mut() = Some(Box::new(|x| { if x == 1 { 1 } else { let f = factorial.borrow(); let g = f.as_ref().unwrap(); x * g(x - 1) } })); let f = factorial.borrow(); let fact = f.as_ref().unwrap(); println!("5! = {}", fact(5)); }

This method creates a mutable reference-counted closure using Rc and RefCell, with the full definition dynamically constructed at runtime to enable recursive self-calls.

Method Three: Y Combinator

Another approach is to use the Y combinator from functional programming to implement recursive closures. The Y combinator can generate a recursive anonymous function, but implementing it in Rust may involve syntactically complex constructs.

Summary

Although implementing recursive closures in Rust has some complexity, we can achieve recursive calls using the above methods. Method two is generally recommended as it is both safe and relatively intuitive. These techniques are highly useful for algorithms requiring recursive calls, such as computing factorials or traversing file directories.

2024年7月17日 19:38 回复

你的答案