closures - 从函数返回一个闭包

标签 closures rust rust-obsolete

Note that this question pertains to a version of Rust before 1.0 was released

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

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 , 或 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() .我相信您可以忍受目前存在的轻微不便。

关于closures - 从函数返回一个闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21130272/

相关文章:

php - 闭包参数和 'use' 关键字有什么区别?

javascript - 为什么我的闭包函数不起作用?

memory - 线程 'main'对 'attempt to multiply with overflow'感到 panic

rust - 如何将值发送到 Nickel 中间件函数

linux - 为什么 999µs 太短而 1000µs 恰到好处?

php - PHP 中字符串内的闭包

javascript - 在循环中根据标准在 IIFE 中调用 setTimeout()

iterator - 是否有 slice::chunks/windows 的等价物用于迭代器循环对、三元组等?

random - 如何在 Rust 中生成一个范围内的随机数?