[英]Composition operator and pipe forward operator in 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.