我试图在生锈中重载右移位运算符(>>)以实现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上发现了一个类似的问题,但是从那以后生锈已经发生了很大变化,所以它不再有效.
由于它对你施加的各种限制,在这里重载右移操作符并不是一个好主意.它通过引用获取所有内容,而您想要的是按值获取所有内容.
无法通过不可变引用调用闭包; 你必须有一个可变引用来调用它,因为它可能会改变它的环境.
你提到的问题时的解决方案是使用&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)
| 归档时间: |
|
| 查看次数: |
490 次 |
| 最近记录: |