请注意,此问题与发布 1.0 之前的 Rust 版本有关
我是否正确理解现在不可能从函数返回闭包,除非它在其参数中提供给函数?这是非常有用的方法,例如,当我需要在程序的不同部分中以不同方式参数化的相同代码块时。目前,编译器自然不允许这样的事情:
fn make_adder(i: int) -> |int| -> int {
|j| i + j
}
闭包在堆栈上分配,并在从函数返回时释放,因此不可能返回它。
将来有可能实现这项工作吗?我听说动态大小的类型会允许这样做。
请注意,此问题与发布 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
,或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()
。我相信你可以忍受目前存在的小不便。