当我需要调用许多可能失败的函数时,我有时会把它们放到闭包中,然后我?
它们并捕获任何特殊的变量(其他语言中的异常机制)。
下面是我对https://www.codewars.com/kata/5a090c4e697598d0b9000004/train/rust的解决方案。
use std::collections::VecDeque;
fn solve(nums: &[i32]) -> Vec<i32> {
let mut sorted = VecDeque::from_iter(nums.iter().copied());
sorted.make_contiguous().sort();
let mut rearranged = vec![];
while let Some(()) =
(||->Option<()>{
rearranged.push(sorted.pop_back()?);
rearranged.push(sorted.pop_front()?);
Some(())
})()
{}
rearranged
}
工作正常,很干净,但我想知道,“Rust是否在每个while
循环迭代上都产生一个闭包”?
如果是,它是否检测到生成的闭包“只是第一个闭包的重复”,并优化重复?
我很感谢一些理论上的考虑,当闭包是在循环内部定义的情况下,像上面。什么优化编译器做,以避免重复的数据?
2条答案
按热度按时间7kqas0il1#
最简单的检查方法是查看生成的程序集,当然使用
--release
。验证码:
在变量(playground)中定义闭包:
它们是一样的。
zazmityj2#
不。这是不可能的,因为这意味着在运行时动态生成代码。闭包的定义忽略了控制流。