从函数返回一个闭包

2024-01-21

请注意,这个问题涉及 1.0 发布之前的 Rust 版本

我是否正确理解,现在不可能从函数返回闭包,除非在其参数中将其提供给函数?这是非常有用的方法,例如,当我需要在程序的不同部分以不同的方式参数化相同的代码块时。目前编译器自然不允许这样的事情:

fn make_adder(i: int) -> |int| -> int {
    |j| i + j
}

闭包在堆栈上分配,并在从函数返回时释放,因此不可能返回它。

将来有可能实现这项工作吗?我听说动态大小的类型可以实现这一点。


这对于堆栈关闭来说是行不通的;它需要要么没有环境,要么拥有自己的环境。 DST 提案确实包括重新引入具有自有环境的封闭类型的可能性(~Fn),这可以满足您的需求,但尚不清楚这是否会发生。

在实践中,还有其他方法可以做到这一点。例如,您可以这样做:

pub struct Adder {
    n: int,
}

impl Add<int, int> for Adder {
    #[inline]
    fn add(&self, rhs: &int) -> int {
        self.n + *rhs
    }
}

fn make_adder(i: int) -> Adder {
    Adder {
        n: int,
    }
}

然后,代替make_adder(3)(4) == 7, 这将是make_adder(3) + 4 == 7, or make_adder(3).add(&4) == 7。 (这是Add<int, int>它正在实施而不仅仅是一个impl Adder { fn add(&self, other: int) -> int { self.n + other }只是为了让您方便+操作员。)

这是一个相当愚蠢的例子,因为Adder也可能是一个int很有可能,但它有它的可能性。

假设您想返回一个计数器;你可能希望将它作为一个返回的函数(0, func),后一个元素是一个将返回的函数(1, func), &C。但这可以用迭代器更好地建模:

use std::num::{Zero, One};

struct Counter<T> {
    value: T,
}

impl<T: Add<T, T> + Zero + One + Clone> Counter<T> {
    fn new() -> Counter<T> {
        Counter { value: Zero::zero() }
    }
}

impl<T: Add<T, T> + Zero + One + Clone> Iterator<T> for Counter<T> {
    #[inline]
    fn next(&mut self) -> Option<T> {
        let mut value = self.value.clone();
        self.value += One::one();
        Some(value)
    }

    // Optional, just for a modicum of efficiency in some places
    #[inline]
    fn size_hint(&self) -> (uint, Option<uint>) {
        (uint::max_value, None)
    }
}

再次,你会看到拥有一个对象的概念您调用一个方法改变其状态并返回所需的值,而不是创建一个新的可调用对象。事情就是这样:目前,您可能希望能够致电object(),你需要打电话object.method()。我确信您可以忍受目前存在的轻微不便。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从函数返回一个闭包 的相关文章

随机推荐