Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 支持可能寿命的高阶函数_Rust - Fatal编程技术网

Rust 支持可能寿命的高阶函数

Rust 支持可能寿命的高阶函数,rust,Rust,假设我有一个高阶函数,例如: 这也不会编译。现在的问题是,compose试图在每次调用结果函数时获得f的所有权。我看不到一种方法来修复用_id编写_(不坚持F:Copy)compose拥有f的所有权,这只能发生一次,因此我们必须选择一个生存期,但返回值需要处理任何生存期 我们可以创建一个用于引用的compose变体: fn compose<A, B, C, G, F>(f: F, g: G) -> impl Fn(&A) -> C where F: Fn(

假设我有一个高阶函数,例如:

这也不会编译。现在的问题是,
compose
试图在每次调用结果函数时获得
f
的所有权。我看不到一种方法来修复
用_id
编写_(不坚持
F:Copy
compose
拥有
f
的所有权,这只能发生一次,因此我们必须选择一个生存期,但返回值需要处理任何生存期

我们可以创建一个用于引用的
compose
变体:

fn compose<A, B, C, G, F>(f: F, g: G) -> impl Fn(&A) -> C
where
    F: Fn(&A) -> &B,
    G: Fn(&B) -> C,
{
    move |x| g(f(x))
}
fn组合(f:f,g:g)->impl-fn(&A)->C
哪里
F:Fn(&A)->&B,
G:Fn&B)->C,
{
移动| x | g(f(x))
}
(其返回值具有HRTB),但不能用于非参考输入


我如何定义
compose
,以便它可以部分应用于不可复制的函数(有或没有引用输入?

如何添加生存期注释以使用\u id进行组合

fn compose_with_id<'a, T, U, F>(f: F) -> impl Fn(&'a T) -> U
where
    T: 'a,
    U: 'a,
    F: Fn(&'a T) -> U,
{
    compose(id, f)
}
fn用_idu组合
哪里
T:a,
U:a,
F:Fn(&'a T)->U,
{
组合(id,f)
}

这使得带有id的compose_的返回类型更窄(即对于某些特定的
'a
,而不是对于U),但这可能是我们能做的最好的了。
fn compose_with_id<T, U, F>(f: F) -> impl Fn(&T) -> U
where
    F: Fn(&T) -> U
{
    move |t| compose(id, f)(t)
}
fn compose<A, B, C, G, F>(f: F, g: G) -> impl Fn(&A) -> C
where
    F: Fn(&A) -> &B,
    G: Fn(&B) -> C,
{
    move |x| g(f(x))
}
fn compose_with_id<'a, T, U, F>(f: F) -> impl Fn(&'a T) -> U
where
    T: 'a,
    U: 'a,
    F: Fn(&'a T) -> U,
{
    compose(id, f)
}