如何为闭包参数指定生命周期?
How can I specify a lifetime for closure arguments?
围栏link:http://is.gd/EpX6lM
我有一个闭包,它接受一个切片和 returns 它的一个子切片。在 rust-1.0.0-beta-2 上编译以下代码失败:
trait OptionalFirst {
fn optional_first<'a>(&self, x: &'a [usize]) -> &'a [usize];
}
impl<F> OptionalFirst for F where F: Fn(&[usize]) -> &[usize] {
fn optional_first<'a>(&self, x: &'a [usize]) -> &'a [usize] {
(*self)(x)
}
}
fn main() {
let bc: Box<OptionalFirst> = Box::new(
|x: &[usize]| -> &[usize] {
if x.len() != 0 {
&x[..1]
}
else {
&x[..0]
}
}) as Box<OptionalFirst>;
let a: [usize; 3] = [1, 2, 3];
let b: &[usize] = bc.optional_first(&a);
println!("{:?}", b);
}
我知道如何在闭包类型中定义生命周期(使用 for <'a>
),但我不知道如何在闭包的实现中指定它。
您的实施 impl<F> OptionalFirst for F where F: Fn(&[usize]) -> &[usize]
需要一个 绑定 生命周期参数,因为约束 F: Fn(&[usize]) -> &[usize]
已扩展为完整形式:F: for<'a> Fn(&'a [usize]) -> &'a [usize]
。
也就是说,在您调用该函数时,它将确定生命周期内 select 的值(它们是泛型)。
但是,闭包不能有任何绑定的生命周期参数;他们被困在使用 concrete 生命周期参数中。它们缺乏将输出生命周期连接到您想要的一般输入生命周期的设施:它们在设计上非常具体,而不是通用的。我没有深入考虑过这个问题,但是 可能 可以抵消通用生命周期参数的影响;但是,据我所知,它并没有实现。
如果您想要这样的东西,请尝试使用函数而不是闭包。当您不使用任何环境时,除了通常较低的冗长程度之外,使用闭包没有任何好处。
这是您的最终结果:
fn bc(x: &[usize]) -> &[usize] {
if x.len() != 0 {
&x[..1]
} else {
&x[..0]
}
}
您可以创建一个带有绑定生命周期参数的闭包,您只需要让编译器正确推断出该类型即可。可以这样做:
fn main() {
let bc: Box<Fn(&[usize]) -> &[usize]> = Box::new(
|x| {
if x.len() != 0 {
&x[..1]
}
else {
&x[..0]
}
});
let a: [usize; 3] = [1, 2, 3];
let b: &[usize] = bc(&a);
println!("{:?}", b);
}
然而,我不知道如何将其进一步转换为 Box<OptionalFirst>
。
围栏link:http://is.gd/EpX6lM
我有一个闭包,它接受一个切片和 returns 它的一个子切片。在 rust-1.0.0-beta-2 上编译以下代码失败:
trait OptionalFirst {
fn optional_first<'a>(&self, x: &'a [usize]) -> &'a [usize];
}
impl<F> OptionalFirst for F where F: Fn(&[usize]) -> &[usize] {
fn optional_first<'a>(&self, x: &'a [usize]) -> &'a [usize] {
(*self)(x)
}
}
fn main() {
let bc: Box<OptionalFirst> = Box::new(
|x: &[usize]| -> &[usize] {
if x.len() != 0 {
&x[..1]
}
else {
&x[..0]
}
}) as Box<OptionalFirst>;
let a: [usize; 3] = [1, 2, 3];
let b: &[usize] = bc.optional_first(&a);
println!("{:?}", b);
}
我知道如何在闭包类型中定义生命周期(使用 for <'a>
),但我不知道如何在闭包的实现中指定它。
您的实施 impl<F> OptionalFirst for F where F: Fn(&[usize]) -> &[usize]
需要一个 绑定 生命周期参数,因为约束 F: Fn(&[usize]) -> &[usize]
已扩展为完整形式:F: for<'a> Fn(&'a [usize]) -> &'a [usize]
。
也就是说,在您调用该函数时,它将确定生命周期内 select 的值(它们是泛型)。
但是,闭包不能有任何绑定的生命周期参数;他们被困在使用 concrete 生命周期参数中。它们缺乏将输出生命周期连接到您想要的一般输入生命周期的设施:它们在设计上非常具体,而不是通用的。我没有深入考虑过这个问题,但是 可能 可以抵消通用生命周期参数的影响;但是,据我所知,它并没有实现。
如果您想要这样的东西,请尝试使用函数而不是闭包。当您不使用任何环境时,除了通常较低的冗长程度之外,使用闭包没有任何好处。
这是您的最终结果:
fn bc(x: &[usize]) -> &[usize] {
if x.len() != 0 {
&x[..1]
} else {
&x[..0]
}
}
您可以创建一个带有绑定生命周期参数的闭包,您只需要让编译器正确推断出该类型即可。可以这样做:
fn main() {
let bc: Box<Fn(&[usize]) -> &[usize]> = Box::new(
|x| {
if x.len() != 0 {
&x[..1]
}
else {
&x[..0]
}
});
let a: [usize; 3] = [1, 2, 3];
let b: &[usize] = bc(&a);
println!("{:?}", b);
}
然而,我不知道如何将其进一步转换为 Box<OptionalFirst>
。