簡體   English   中英

Rust 中的組合運算符和管道轉發運算符

[英]Composition operator and pipe forward operator in Rust

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新類型結構純粹是為了允許Shr實例,否則我們將不得不在泛型上實現它(即impl<A, B> Shr<...> for A )並且這是行不通的。


請注意,慣用的 Rust 會將此稱為方法map而不是使用運算符。 有關規范示例,請參閱Option::map

據我所知,這些操作符在 Rust 中不存在。 到目前為止,我還沒有覺得對它們有太大的需求,而且還努力使核心 Rust 語法保持在相當小的范圍內。 例如,Rust 曾經有明確的消息傳遞操作符,但這些都被刪除了。

如果您願意,您可以使用運算符重載來想出類似的東西,或者只是編寫自己的撰寫或管道轉發功能。 如果 Rust 團隊願意將這些包含在標准庫中,我不會感到驚訝。

雖然這些操作符本身並不存在,但Option::map提供了一個慣用的模擬。

fn do_some_stuff_to_a_number(x: Option<i32>) -> Option<String> {
    x.map(|x| x + 1).map(|x| 2 * x).map(|x: i32| x.to_string())
}

並且沒有函數:

let string = Some(1)
    .map(|x| x + 1)
    .map(|x| 2 * x)
    .map(|x: i32| x.to_string())?;

實際上,rust 確實有一個非常相似的運算符,它被稱為點運算符,但是它不適用於獨立函數,這是唯一的主要問題。 IE。 未在 impl! 中定義的函數。

您可以編寫類似Option::map(Option::Some(1),|x| x+1) ,它是 'f(g(x)' 樣式或使用點的代碼,例如Option::Some(1).map(|x| x+1)更像是f |> g(x)風格。

點運算符允許您根據需要多次鏈接方法。 然而,使編譯器工作更容易是有限制的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM