成分和管道向前操作器(like in other languages)是否都存在 rust 蚀?如果是这样的话,它们看起来是什么样的?一个应该优先于另一个?如果不存在,为什么不需要这个操作员?

推荐答案

没有内置这样的操作符,但定义起来并不特别困难:

use std::ops::Shr;

struct Wrapped<T>(T);

impl<A, B, F> Shr<F> for Wrapped<A>
where
    F: FnOnce(A) -> B,
{
    type Output = Wrapped<B>;

    fn shr(self, f: F) -> Wrapped<B> {
        Wrapped(f(self.0))
    }
}

fn main() {
    let string = Wrapped(1) >> (|x| x + 1) >> (|x| 2 * x) >> (|x: i32| x.to_string());
    println!("{}", string.0);
}
// prints `4`

Wrapped新类型的 struct 纯粹是为了允许Shr实例,因为否则我们必须在泛型(即impl<A, B> Shr<...> for A)上实现它,这是行不通的.


注意,惯用的Rust会将其称为方法map,而不是使用运算符.参见Option::map以获取规范示例.

Rust相关问答推荐

如何在Rust中为具有多个数据持有者的enum变体编写文档 comments ?

在一个tauri协议处理程序中调用一个rectuc函数的推荐技术是什么?

在HashMap中插入Vacant条目的可变借位问题

当一个箱子有自己的依赖关系时,两个人如何克服S每箱1库+n箱的限制?

从Type::new()调用函数

异步函数返回的future 生存期

Rust 中的内存管理

Rust:为什么 Pin 必须持有指针?

一旦令牌作为文字使用,声明宏不匹配硬编码值?

在不安全的 Rust 中存储对 struct 内部数据的静态引用是否合法?

在给定 Rust 谓词的情况下,将 Some 转换为 None 的惯用方法是什么?

打印 `format_args!` 时borrow 时临时值丢失

如何使返回 XMLError 的方法与 anyhow::Error 兼容?

`use std::error::Error` 声明中断编译

实现不消费的迭代器

如何将 u8 切片复制到 u32 切片中?

Rust 为什么 (u32, u32) 的枚举变体的大小小于 (u64)?

C++ 中的 CRTP 是一种表达其他语言中特征和/或 ADT 的方法吗?

如何迭代调用可能会失败的函数?操作员?

基于名称是否存在的条件编译