Rust Shr操作员

mwh*_*ker 5 rust

我试图在生锈中重载右移位运算符(>>)以实现Maybe绑定.

enum Maybe<T> {
    Nothing,
    Just(T)
}

/// Maybe bind. For example:
///
/// ```
/// Just(1) >> |x| Just(1 + x) >> |x| Just(x * 2)
/// ```
impl<'a, T, U> Shr<|&T|: 'a -> Maybe<U>, Maybe<U>> for Maybe<T> {
    fn shr(&self, f: &|&T| -> Maybe<U>) -> Maybe<U> {
        match *self {
            Nothing => Nothing,
            Just(ref x) => (*f)(x)
        }
    }
}

fn main() {}
Run Code Online (Sandbox Code Playgroud)

但是,我在尝试调用闭包时遇到错误:

<anon>:15:28: 15:32 error: closure invocation in a `&` reference
<anon>:15             Just(ref x) => (*f)(x)
                                     ^~~~
error: aborting due to previous error
playpen: application terminated with error code 101
Program ended.
Run Code Online (Sandbox Code Playgroud)

为什么调用借用的闭包是错误的,如何解决问题并实现绑定?

我在stackoverflow上发现了一个类似的问题,但是从那以后生锈已经发生了很大变化,所以它不再有效.

Chr*_*gan 5

由于它对你施加的各种限制,在这里重载右移操作符并不是一个好主意.它通过引用获取所有内容,而您想要的是按获取所有内容.

无法通过不可变引用调用闭包; 你必须有一个可变引用来调用它,因为它可能会改变它的环境.

你提到的问题时的解决方案是使用&fn(&A) -> B,这是一个不可变的闭包; 目前我们没有这种类型; |&A| -> B从那时&mut fn(&A) -> B起是平行的,因为它是通过不可变引用完成的,所以它根本无法工作.当然,明智的做法self是以价值取胜并具有以下功能|A| -> B; 这是什么Option.and_then,这是正是你想什么来实现,确实.

简而言之,你想要做的事情目前是不可能的,虽然它可能在未来的某个时候再次成为可能.使用常规方法而不是尝试重载运算符.

或者只是使用Option,已经存在:

Some(1i).and_then(|x| Some(1 + x))
        .and_then(|x| Some(x * 2))
Run Code Online (Sandbox Code Playgroud)