gpt4 book ai didi

Rust Shr 运算符

转载 作者:行者123 更新时间:2023-11-29 07:49:22 25 4
gpt4 key购买 nike

我正在尝试使 right shift operator 过载(>>) 使用rust 到 implement a Maybe bind .

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() {}

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

<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.

为什么调用借用的闭包会出错,如何解决问题并实现绑定(bind)?

我找到了一个 similar question在 stackoverflow 上,但从那时起 rust 已经发生了足够多的变化,因此它不再有效。

最佳答案

重载 shift-right 运算符在这里不是一个好主意,因为它会给您带来各种限制。它通过引用获取所有内容,而您想要的是通过获取所有内容。

无法通过不可变引用调用闭包;您必须有一个可变引用才能调用它,因为它可能会改变其环境。

你提到的问题当时的解决方案是使用&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))

关于Rust Shr 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24522548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com